mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2025-09-23 09:20:51 +02:00
Compare commits
3427 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4674431829 | ||
![]() |
2b9c7fee20 | ||
![]() |
fbab80145e | ||
![]() |
95d8b12065 | ||
![]() |
9f8b7a180f | ||
![]() |
7f62f56661 | ||
![]() |
28ecf98fa6 | ||
![]() |
68f55e6639 | ||
![]() |
83e7af4503 | ||
![]() |
fbfaa8d25f | ||
![]() |
b46d199086 | ||
![]() |
64c6aac0cf | ||
![]() |
f3c64edf6e | ||
![]() |
61673cda70 | ||
![]() |
d71e6b18c0 | ||
![]() |
19fe47f71e | ||
![]() |
720bcbf8ac | ||
![]() |
bb3b7d68c1 | ||
![]() |
eb4b6d2a7f | ||
![]() |
abc3e8d59c | ||
![]() |
9f05f360f9 | ||
![]() |
9b2dc1b263 | ||
![]() |
50777d8d2c | ||
![]() |
63e85fe4be | ||
![]() |
b1eaf5616a | ||
![]() |
22aa6d16a2 | ||
![]() |
dfaa5675b6 | ||
![]() |
ab4e1819c1 | ||
![]() |
91aa65e717 | ||
![]() |
ec684434dc | ||
![]() |
3b5b9d7dab | ||
![]() |
e7082baaff | ||
![]() |
1caafac89a | ||
![]() |
26e2fc6d91 | ||
![]() |
740fa67a4e | ||
![]() |
d468423db3 | ||
![]() |
84664ebcdc | ||
![]() |
987078fab5 | ||
![]() |
7da28f28e5 | ||
![]() |
3c9af84ea2 | ||
![]() |
286fd19ba2 | ||
![]() |
39dce71c28 | ||
![]() |
b3b1d6d706 | ||
![]() |
c04040468e | ||
![]() |
aee7777478 | ||
![]() |
09c1e21560 | ||
![]() |
60e9f56b0f | ||
![]() |
302e4ab664 | ||
![]() |
484c3aa320 | ||
![]() |
0bc769b971 | ||
![]() |
5b98d41637 | ||
![]() |
e14b7851b1 | ||
![]() |
13d2334a45 | ||
![]() |
9864e04aae | ||
![]() |
4d6bbbf004 | ||
![]() |
44305b4ccd | ||
![]() |
7f86b13d93 | ||
![]() |
d65b8d7d18 | ||
![]() |
6968dd266a | ||
![]() |
8754cbb38f | ||
![]() |
c7b4705538 | ||
![]() |
065faf31b6 | ||
![]() |
da4b27f606 | ||
![]() |
e1cc84ab5f | ||
![]() |
533aede80f | ||
![]() |
e84d5311f9 | ||
![]() |
476b3f804b | ||
![]() |
9445e8e8a0 | ||
![]() |
e539753279 | ||
![]() |
f5f81be6fe | ||
![]() |
3b8a55f0d3 | ||
![]() |
b1dd6cbb6e | ||
![]() |
431724f637 | ||
![]() |
6e5851aea8 | ||
![]() |
30e5e58178 | ||
![]() |
40207b515d | ||
![]() |
95a6aaac76 | ||
![]() |
da43f47487 | ||
![]() |
ae5360fb27 | ||
![]() |
47d2ae5c5e | ||
![]() |
e1101dd6f1 | ||
![]() |
d460351da2 | ||
![]() |
fd076f5a58 | ||
![]() |
f7d73fc21b | ||
![]() |
5680b7c477 | ||
![]() |
9f9b53c067 | ||
![]() |
18d986a57d | ||
![]() |
61632b3d9d | ||
![]() |
f1688fb8b1 | ||
![]() |
f0e85b31aa | ||
![]() |
316871714a | ||
![]() |
12c72842ff | ||
![]() |
4230e11c4d | ||
![]() |
c76ff8d367 | ||
![]() |
831e9985e2 | ||
![]() |
9912ee8199 | ||
![]() |
55d17b556a | ||
![]() |
5495be749b | ||
![]() |
54f71c623a | ||
![]() |
e3a891688b | ||
![]() |
09d36a5dbc | ||
![]() |
ff493406cf | ||
![]() |
fbcee61e04 | ||
![]() |
e62e34fd5c | ||
![]() |
3b57135a6e | ||
![]() |
69934dee52 | ||
![]() |
51f2efd48c | ||
![]() |
4de2cfdcc6 | ||
![]() |
7845b7678d | ||
![]() |
6f9543b9cf | ||
![]() |
5b541cc9fb | ||
![]() |
ea54520e0b | ||
![]() |
00b6bd517a | ||
![]() |
9fb5aa4b46 | ||
![]() |
f089cd027e | ||
![]() |
5151c6cb54 | ||
![]() |
9407ac8c24 | ||
![]() |
6a91a3a947 | ||
![]() |
ac0bcea371 | ||
![]() |
302a6ff4e8 | ||
![]() |
0d89667428 | ||
![]() |
dbb6848a9b | ||
![]() |
a843e808d1 | ||
![]() |
67af05e504 | ||
![]() |
c995c6fda5 | ||
![]() |
3b5cf0e37c | ||
![]() |
c7a9847e66 | ||
![]() |
3624f1b9a2 | ||
![]() |
aecc908152 | ||
![]() |
9f9c6eff00 | ||
![]() |
99400fa570 | ||
![]() |
17d00837bd | ||
![]() |
0882d9d66b | ||
![]() |
0df81409bf | ||
![]() |
a75deb6ba2 | ||
![]() |
4b8474b0ac | ||
![]() |
7478e96a15 | ||
![]() |
c1d9a253b0 | ||
![]() |
eb7d9f76e5 | ||
![]() |
ec45d4a729 | ||
![]() |
07544cd198 | ||
![]() |
3f3d1bfccf | ||
![]() |
d3cb887ff0 | ||
![]() |
88c68315f6 | ||
![]() |
2d62fa401d | ||
![]() |
3ff85c2ab7 | ||
![]() |
13f5d3b5ac | ||
![]() |
9eb55e1be5 | ||
![]() |
6adbfade2b | ||
![]() |
7568616f8e | ||
![]() |
c93be13dfe | ||
![]() |
e9dc96944b | ||
![]() |
06e536eb45 | ||
![]() |
72e90b4d57 | ||
![]() |
83d43f845f | ||
![]() |
5ed5a81708 | ||
![]() |
ce003d2683 | ||
![]() |
75248d7a12 | ||
![]() |
06eff256f3 | ||
![]() |
a476f332f7 | ||
![]() |
6d49148c32 | ||
![]() |
85acc53d40 | ||
![]() |
f319e3e75a | ||
![]() |
3abc660eb3 | ||
![]() |
4c13dda1f9 | ||
![]() |
294c35b2fb | ||
![]() |
badaff8ebc | ||
![]() |
7045f9711c | ||
![]() |
aaf5d7b89c | ||
![]() |
487952f52e | ||
![]() |
34e31807fc | ||
![]() |
21184f8755 | ||
![]() |
2bac66b5fe | ||
![]() |
b5f069d080 | ||
![]() |
bc393e6bcd | ||
![]() |
af411a61ae | ||
![]() |
2805850711 | ||
![]() |
0f0a367174 | ||
![]() |
7009dc574f | ||
![]() |
6941917c75 | ||
![]() |
9560cf59be | ||
![]() |
0a2374892c | ||
![]() |
5d5c2ae2ed | ||
![]() |
2cceb048e3 | ||
![]() |
ed9c85b25a | ||
![]() |
bb8bcf3c33 | ||
![]() |
b5684ee7df | ||
![]() |
2c27f784f7 | ||
![]() |
46c1155c64 | ||
![]() |
471ce4a24b | ||
![]() |
b6841158df | ||
![]() |
3372bacc62 | ||
![]() |
6da9096176 | ||
![]() |
244009a1cd | ||
![]() |
0f22833ad5 | ||
![]() |
b589ee6c26 | ||
![]() |
9f0efdd544 | ||
![]() |
07c7398a96 | ||
![]() |
a117e459b0 | ||
![]() |
7568af408a | ||
![]() |
d1801e1dbc | ||
![]() |
38d193899c | ||
![]() |
f95d51b307 | ||
![]() |
1bf55c2139 | ||
![]() |
9b09028440 | ||
![]() |
0cc890a1d1 | ||
![]() |
fe138f6d61 | ||
![]() |
4e1638f86e | ||
![]() |
daa4fd5103 | ||
![]() |
a3d8848825 | ||
![]() |
61d102dc75 | ||
![]() |
c0519d8313 | ||
![]() |
48a2d2d24b | ||
![]() |
fb0d626cb2 | ||
![]() |
766326ad8c | ||
![]() |
2a903f66dd | ||
![]() |
8712310ad9 | ||
![]() |
e8c3ab87c4 | ||
![]() |
90c20f124b | ||
![]() |
cd225eb5fe | ||
![]() |
14e852237f | ||
![]() |
d36ac7a5de | ||
![]() |
55a138e8da | ||
![]() |
c5e6bb58bc | ||
![]() |
2642d6f5f0 | ||
![]() |
bcb3cb9125 | ||
![]() |
f7203d4ac9 | ||
![]() |
6be23a0a6f | ||
![]() |
089a9f1a9c | ||
![]() |
2977de1df2 | ||
![]() |
eab3f8b3ff | ||
![]() |
d686a2c9dc | ||
![]() |
d34e5f78a9 | ||
![]() |
edc9d47da7 | ||
![]() |
0c5608506e | ||
![]() |
bda6139f42 | ||
![]() |
1ae8ca1e21 | ||
![]() |
342377e69a | ||
![]() |
0447e4e664 | ||
![]() |
fd3d61c6a0 | ||
![]() |
69bf1c5d81 | ||
![]() |
fbf6351b99 | ||
![]() |
a78762756a | ||
![]() |
1f24c18614 | ||
![]() |
153790d80a | ||
![]() |
e98f27cb66 | ||
![]() |
c17d80948c | ||
![]() |
c486368b9b | ||
![]() |
42bb96af23 | ||
![]() |
e082976914 | ||
![]() |
156a2eb4ff | ||
![]() |
e94981e6f7 | ||
![]() |
be92921034 | ||
![]() |
94403a9c3c | ||
![]() |
b5ea61a079 | ||
![]() |
af9e2420a6 | ||
![]() |
14b3cf7ccd | ||
![]() |
9c58a07a72 | ||
![]() |
609855f774 | ||
![]() |
37409e7d90 | ||
![]() |
cc83991d8d | ||
![]() |
bf5e94fc1a | ||
![]() |
52420d4bf1 | ||
![]() |
7f7bf8474e | ||
![]() |
e1145f16f2 | ||
![]() |
b430a23df1 | ||
![]() |
fa7173b3d5 | ||
![]() |
b2d78786c2 | ||
![]() |
489420e855 | ||
![]() |
5bc0d2c31b | ||
![]() |
e9fda96aa1 | ||
![]() |
64b0ccd574 | ||
![]() |
d3aadc71b1 | ||
![]() |
c21ccef7bc | ||
![]() |
2152375227 | ||
![]() |
10d57afaac | ||
![]() |
e224f8ca28 | ||
![]() |
1f975c0a3a | ||
![]() |
ce075395a1 | ||
![]() |
167653ac60 | ||
![]() |
ee0f94c232 | ||
![]() |
0ed3354cee | ||
![]() |
b8f726153f | ||
![]() |
afc362d2b6 | ||
![]() |
776d8a4406 | ||
![]() |
7718581882 | ||
![]() |
ba245c49da | ||
![]() |
cf60033424 | ||
![]() |
0e39071b5e | ||
![]() |
b6028cef5b | ||
![]() |
62906fb84a | ||
![]() |
4797cd9184 | ||
![]() |
366c55c8f4 | ||
![]() |
7e93456805 | ||
![]() |
de1a92539a | ||
![]() |
84dd1a688e | ||
![]() |
36c4063db6 | ||
![]() |
9c9a432ea0 | ||
![]() |
1c53b22239 | ||
![]() |
5dbab85505 | ||
![]() |
2873f723e8 | ||
![]() |
6b7043fb9d | ||
![]() |
9d5612d104 | ||
![]() |
e58088d290 | ||
![]() |
77aa12dd81 | ||
![]() |
8c3be2c9df | ||
![]() |
266c3d03fc | ||
![]() |
42ff60ce85 | ||
![]() |
e08e724573 | ||
![]() |
b155f23d27 | ||
![]() |
a2d3e2c7e0 | ||
![]() |
ed18466c3b | ||
![]() |
845767e2f8 | ||
![]() |
a0548fdbf8 | ||
![]() |
b837912e75 | ||
![]() |
0cd9fb32a8 | ||
![]() |
fd62411b35 | ||
![]() |
134850aa04 | ||
![]() |
0795135f2f | ||
![]() |
85eb1dc436 | ||
![]() |
2f2b8784f9 | ||
![]() |
181658e5a4 | ||
![]() |
7dbb2b206c | ||
![]() |
ef90493c27 | ||
![]() |
d949894511 | ||
![]() |
570dded8d6 | ||
![]() |
235ead9222 | ||
![]() |
3ee6788753 | ||
![]() |
e3dfab5078 | ||
![]() |
5f232a059d | ||
![]() |
1b708d261d | ||
![]() |
3341742f66 | ||
![]() |
b731c79339 | ||
![]() |
29b12c2f84 | ||
![]() |
ba53f6611c | ||
![]() |
6eeed50418 | ||
![]() |
8caf9f87a1 | ||
![]() |
2e6089088b | ||
![]() |
40eaa166ae | ||
![]() |
41e2e5f951 | ||
![]() |
ac3938d529 | ||
![]() |
515ec4d66d | ||
![]() |
5adc27ea2b | ||
![]() |
ab089a5f93 | ||
![]() |
9d8fcbbffe | ||
![]() |
590722d929 | ||
![]() |
a0ee1b1653 | ||
![]() |
b965f88eb2 | ||
![]() |
a228e702da | ||
![]() |
105981b2eb | ||
![]() |
055365a449 | ||
![]() |
f8a7aac40d | ||
![]() |
6712ea5e6f | ||
![]() |
382e69273e | ||
![]() |
9b71828b97 | ||
![]() |
00eddcb237 | ||
![]() |
49cc643dcc | ||
![]() |
42ec6f0810 | ||
![]() |
9f47a274a8 | ||
![]() |
1f8c0a9e5e | ||
![]() |
cef9ccd937 | ||
![]() |
9d773d6e8a | ||
![]() |
3d93ecd6ec | ||
![]() |
36e38e50e9 | ||
![]() |
1a8be2bbf5 | ||
![]() |
92b1fa5743 | ||
![]() |
335e5c05db | ||
![]() |
bfead79c07 | ||
![]() |
bd8014bcbd | ||
![]() |
948d57d3d1 | ||
![]() |
31b830d6d0 | ||
![]() |
2038df976c | ||
![]() |
46cc215120 | ||
![]() |
3afce82aa7 | ||
![]() |
88e5be237e | ||
![]() |
7c4b9d8843 | ||
![]() |
b83e1716fe | ||
![]() |
c3e41e2427 | ||
![]() |
3f67b3b73c | ||
![]() |
78c9e4e1ad | ||
![]() |
69c090b5a1 | ||
![]() |
2c8222fd55 | ||
![]() |
d071891b2a | ||
![]() |
986acc5fc5 | ||
![]() |
e4295fb3fa | ||
![]() |
cfad3fb5de | ||
![]() |
b18236a27e | ||
![]() |
f6bbc69cf9 | ||
![]() |
707e4f7167 | ||
![]() |
11d06dc86d | ||
![]() |
8f46432391 | ||
![]() |
99cdaec40e | ||
![]() |
b32935a1b0 | ||
![]() |
ed9a3517c6 | ||
![]() |
e0a39efa2b | ||
![]() |
3ad0e313ca | ||
![]() |
bca547ce44 | ||
![]() |
6bc697f926 | ||
![]() |
bff5371e41 | ||
![]() |
694013c9df | ||
![]() |
a76398efd0 | ||
![]() |
99bcd8d043 | ||
![]() |
1602ecbaf9 | ||
![]() |
7e17bdf369 | ||
![]() |
d316bbad44 | ||
![]() |
72151c8c0c | ||
![]() |
e2e0a9bfa2 | ||
![]() |
8d53b07167 | ||
![]() |
1df852171d | ||
![]() |
399e2626fb | ||
![]() |
752a76eb44 | ||
![]() |
8feee05eec | ||
![]() |
e9a4caaf0b | ||
![]() |
8de367e03f | ||
![]() |
dad88b83fb | ||
![]() |
846f7f2f05 | ||
![]() |
41e18ae694 | ||
![]() |
deeac118a1 | ||
![]() |
594d77e713 | ||
![]() |
2ea404659b | ||
![]() |
e2ec95e6ff | ||
![]() |
db87df743d | ||
![]() |
23f9ffdab7 | ||
![]() |
28063c35c2 | ||
![]() |
21a39b06e7 | ||
![]() |
8fb29ae6c2 | ||
![]() |
21895caa3a | ||
![]() |
f17b92512c | ||
![]() |
014682664d | ||
![]() |
5bf1df9f14 | ||
![]() |
dea1e0dcb9 | ||
![]() |
eb5fb42da9 | ||
![]() |
c46a0f7b2e | ||
![]() |
835476870b | ||
![]() |
718acb5059 | ||
![]() |
1aa763e86c | ||
![]() |
0395dc6e9e | ||
![]() |
96de70b71e | ||
![]() |
f44883e79f | ||
![]() |
c56fb8cec2 | ||
![]() |
3625a38a23 | ||
![]() |
1393d3ad7f | ||
![]() |
b674cfec24 | ||
![]() |
f0f0c43b72 | ||
![]() |
33caad4690 | ||
![]() |
0afc8005d0 | ||
![]() |
f04d2e76fa | ||
![]() |
8e1d7f162d | ||
![]() |
ee65e89230 | ||
![]() |
a8e26238a8 | ||
![]() |
a3dc95bef1 | ||
![]() |
a29df9a2dd | ||
![]() |
cc17d268fc | ||
![]() |
22a9a06b87 | ||
![]() |
d063d39dbc | ||
![]() |
87e29dbd84 | ||
![]() |
2227a7a6bd | ||
![]() |
867f633d16 | ||
![]() |
b9de3c202a | ||
![]() |
56364c4a2c | ||
![]() |
b1fd2c007d | ||
![]() |
741a872c39 | ||
![]() |
e1e2add616 | ||
![]() |
0c664e346a | ||
![]() |
7ddb856ccd | ||
![]() |
17c0b981d1 | ||
![]() |
7f0a9904ff | ||
![]() |
2b4190d85d | ||
![]() |
57e89babf1 | ||
![]() |
209dc5ace9 | ||
![]() |
ab7f3c7399 | ||
![]() |
1e7e8d4121 | ||
![]() |
04b75ef05f | ||
![]() |
de19421de1 | ||
![]() |
61f64a7349 | ||
![]() |
6fb16bad85 | ||
![]() |
694813ac90 | ||
![]() |
6f3fd50ed8 | ||
![]() |
c1e1c191d0 | ||
![]() |
f4c8fdaf07 | ||
![]() |
457ebe3aa2 | ||
![]() |
8da8ce0a0a | ||
![]() |
cc869b98a3 | ||
![]() |
f9e7873e54 | ||
![]() |
c4cba8aa37 | ||
![]() |
22e4ef4034 | ||
![]() |
708cdc4c62 | ||
![]() |
94931df60b | ||
![]() |
b3605fe6d4 | ||
![]() |
11e0ed7c4f | ||
![]() |
34e89448b1 | ||
![]() |
9a6e936996 | ||
![]() |
5ed58b8609 | ||
![]() |
0d7d610127 | ||
![]() |
9f789167da | ||
![]() |
92a42235a1 | ||
![]() |
3f52938f08 | ||
![]() |
a08cd4ce6a | ||
![]() |
46b12ed819 | ||
![]() |
e7ef193da6 | ||
![]() |
2ebe5aa878 | ||
![]() |
f58f6639f8 | ||
![]() |
f995ba115c | ||
![]() |
755dff343d | ||
![]() |
c8c7d23971 | ||
![]() |
9309159c38 | ||
![]() |
8e45296826 | ||
![]() |
559bcfc6a5 | ||
![]() |
23c2f748d6 | ||
![]() |
3e409b9cc1 | ||
![]() |
c0453065e4 | ||
![]() |
88a6e5981f | ||
![]() |
8970a663ec | ||
![]() |
334437137e | ||
![]() |
949c01b37f | ||
![]() |
17146c2c13 | ||
![]() |
dcd35b038e | ||
![]() |
550364906d | ||
![]() |
fa8483bbb6 | ||
![]() |
b976e40439 | ||
![]() |
6fcae39fe2 | ||
![]() |
ec1de9824a | ||
![]() |
8f83c210ad | ||
![]() |
d68009ff7e | ||
![]() |
bac2045111 | ||
![]() |
bbf3c37978 | ||
![]() |
901c63d1f2 | ||
![]() |
13306b5c1b | ||
![]() |
b883ad1657 | ||
![]() |
6029e18980 | ||
![]() |
a81b791ee3 | ||
![]() |
7e5aaabadf | ||
![]() |
e01e0d5aed | ||
![]() |
db07b81c3c | ||
![]() |
d660e4ac9d | ||
![]() |
d90588ce6b | ||
![]() |
7e78197b37 | ||
![]() |
06af26f1f2 | ||
![]() |
d0e07276dd | ||
![]() |
59c19614ea | ||
![]() |
0f04dd6dae | ||
![]() |
b365973ac6 | ||
![]() |
19fb8cfbfe | ||
![]() |
d8e6a5cb33 | ||
![]() |
f4c6a49339 | ||
![]() |
23ee22566d | ||
![]() |
ea70a1f334 | ||
![]() |
68a1407314 | ||
![]() |
881efb9be8 | ||
![]() |
7844547e4f | ||
![]() |
054279d553 | ||
![]() |
b2bbdc656a | ||
![]() |
a0151f2a68 | ||
![]() |
fd5f4d9840 | ||
![]() |
98d7e6bcc6 | ||
![]() |
e92ca5e572 | ||
![]() |
27ca9ed8b8 | ||
![]() |
c2b1d45fc4 | ||
![]() |
03939555ac | ||
![]() |
5a2cd93d13 | ||
![]() |
ef69625cd2 | ||
![]() |
ae88b4c697 | ||
![]() |
693756bdd6 | ||
![]() |
c05633979c | ||
![]() |
7d80d04f34 | ||
![]() |
3ff2da3b20 | ||
![]() |
eb15bc97a7 | ||
![]() |
c6cd2dd854 | ||
![]() |
aae8865bdd | ||
![]() |
c15cead9e2 | ||
![]() |
0ccd30b12e | ||
![]() |
d2a59ecc62 | ||
![]() |
7a67d192c3 | ||
![]() |
d32ad36f3d | ||
![]() |
f587d79cd8 | ||
![]() |
9e290ce91a | ||
![]() |
0c40a45075 | ||
![]() |
17c5e73994 | ||
![]() |
890d1cb50b | ||
![]() |
4c89d1a6e5 | ||
![]() |
77d3a1ef45 | ||
![]() |
6e289b44c7 | ||
![]() |
8039055a87 | ||
![]() |
6c0f5bef21 | ||
![]() |
7dd7ea1a32 | ||
![]() |
3bce9a8ead | ||
![]() |
da82e3f5d1 | ||
![]() |
0df5d7a934 | ||
![]() |
27f38f329f | ||
![]() |
c4707978c4 | ||
![]() |
2ad0792581 | ||
![]() |
8741856234 | ||
![]() |
e37a86efc2 | ||
![]() |
baee238a2c | ||
![]() |
e8437052d8 | ||
![]() |
cf13f5ca56 | ||
![]() |
52f82ed228 | ||
![]() |
84ec320df4 | ||
![]() |
0033843bc2 | ||
![]() |
3ca461413e | ||
![]() |
e6d9d8e26d | ||
![]() |
763995d4c9 | ||
![]() |
8a992d4c47 | ||
![]() |
da052df106 | ||
![]() |
60d4c8a55d | ||
![]() |
4292ca94ff | ||
![]() |
570738190d | ||
![]() |
86dafdd92b | ||
![]() |
dab53450c1 | ||
![]() |
773aa1eff0 | ||
![]() |
14de2f289f | ||
![]() |
eeeeeef3a7 | ||
![]() |
ea1be11a80 | ||
![]() |
309fd3fb7d | ||
![]() |
6a24dcec73 | ||
![]() |
3e2dba2fd5 | ||
![]() |
527c38adf9 | ||
![]() |
f62a7919a5 | ||
![]() |
844f80a5f1 | ||
![]() |
94e23142a5 | ||
![]() |
9339fc80b4 | ||
![]() |
d092e39c56 | ||
![]() |
160a33e8c8 | ||
![]() |
429ee7eb93 | ||
![]() |
c891f2f1ed | ||
![]() |
3108c903dd | ||
![]() |
0cdfa6e377 | ||
![]() |
52a21e4a24 | ||
![]() |
8e152df46d | ||
![]() |
a68c8ceebe | ||
![]() |
1ce44b31e2 | ||
![]() |
8f52f918db | ||
![]() |
55f5f76275 | ||
![]() |
f122d73754 | ||
![]() |
8227d85feb | ||
![]() |
46e2f4e579 | ||
![]() |
0c65f73180 | ||
![]() |
0fb7eab2f9 | ||
![]() |
2b2de8811e | ||
![]() |
5e87463125 | ||
![]() |
424d3fdcd7 | ||
![]() |
6452c7e08c | ||
![]() |
e21257b786 | ||
![]() |
0f70aeb910 | ||
![]() |
cedfbf5f67 | ||
![]() |
31fab60701 | ||
![]() |
afef8d8d0b | ||
![]() |
ac2543d0a1 | ||
![]() |
81658de08f | ||
![]() |
2ad0d47f61 | ||
![]() |
b9d6d55aa4 | ||
![]() |
719d8651b3 | ||
![]() |
f3988c37b6 | ||
![]() |
912f09c83e | ||
![]() |
27330951aa | ||
![]() |
84089453e7 | ||
![]() |
59f76ef304 | ||
![]() |
4061145933 | ||
![]() |
e900a69a26 | ||
![]() |
9cdec5de50 | ||
![]() |
ceabfd1a8b | ||
![]() |
bc283bce4e | ||
![]() |
544cae4fb4 | ||
![]() |
38a0395d45 | ||
![]() |
a5b7666188 | ||
![]() |
58a626dedb | ||
![]() |
7e311e5567 | ||
![]() |
596005c69e | ||
![]() |
14ee7d53d7 | ||
![]() |
2f575c13f1 | ||
![]() |
82738e23ce | ||
![]() |
93e99d096a | ||
![]() |
784b9cf207 | ||
![]() |
7b56244c8b | ||
![]() |
44192d6e49 | ||
![]() |
4ded3adadb | ||
![]() |
3798d5228c | ||
![]() |
0491c4af9c | ||
![]() |
69799613aa | ||
![]() |
c0cbec700c | ||
![]() |
e9c9dfcd8c | ||
![]() |
c9cbb1e6f1 | ||
![]() |
3ea8841e3a | ||
![]() |
8b26e5b106 | ||
![]() |
495fa170a9 | ||
![]() |
406d02fd28 | ||
![]() |
3ad8883999 | ||
![]() |
dcd7055a9d | ||
![]() |
a8e326ceea | ||
![]() |
b125ff702a | ||
![]() |
6e546703a9 | ||
![]() |
71f1bbdcc1 | ||
![]() |
bdb86a7fde | ||
![]() |
8ac8258400 | ||
![]() |
0338ff8d51 | ||
![]() |
d694e61006 | ||
![]() |
b6be586766 | ||
![]() |
9915287a5a | ||
![]() |
cb19f792da | ||
![]() |
f449aee901 | ||
![]() |
b665122c3c | ||
![]() |
f4dbd5c9bd | ||
![]() |
cb6d7e6dd7 | ||
![]() |
4d4a86f889 | ||
![]() |
e3829303f9 | ||
![]() |
86d4cf3dfc | ||
![]() |
ed4196f732 | ||
![]() |
af70fdd7a6 | ||
![]() |
0ee6c1e47e | ||
![]() |
0886c6b216 | ||
![]() |
754fe3adfb | ||
![]() |
b5058f99ce | ||
![]() |
f7be693470 | ||
![]() |
b772afeeab | ||
![]() |
f0c7cb9f94 | ||
![]() |
1561c210fb | ||
![]() |
727fb27ad0 | ||
![]() |
ceb1d70551 | ||
![]() |
720bff02aa | ||
![]() |
f82dd3e152 | ||
![]() |
a3dff2c608 | ||
![]() |
28f87dcb2b | ||
![]() |
4daae95979 | ||
![]() |
577bfab366 | ||
![]() |
655993d8f2 | ||
![]() |
3e079a6858 | ||
![]() |
e5afffdced | ||
![]() |
a43c434376 | ||
![]() |
225647cf65 | ||
![]() |
fdab92c92b | ||
![]() |
72adb7a53b | ||
![]() |
f84907e2c9 | ||
![]() |
ab3b8d0a14 | ||
![]() |
5e7b635006 | ||
![]() |
58181ee37f | ||
![]() |
4db4b3af86 | ||
![]() |
504f45efa6 | ||
![]() |
114a7ccdd4 | ||
![]() |
1a9b3c9d7c | ||
![]() |
137fabee0e | ||
![]() |
2d41022ee4 | ||
![]() |
2ce0caa943 | ||
![]() |
2839154b68 | ||
![]() |
e25c5544ba | ||
![]() |
7c70033f19 | ||
![]() |
59f90fcdfe | ||
![]() |
e05def491f | ||
![]() |
19738c0c1b | ||
![]() |
0790a43aa2 | ||
![]() |
fd4a4d979a | ||
![]() |
6011dec272 | ||
![]() |
98ae78eb06 | ||
![]() |
b861f21bca | ||
![]() |
0e0f498c06 | ||
![]() |
0a66f54487 | ||
![]() |
5e2f373a57 | ||
![]() |
ae8f47500f | ||
![]() |
36c1e19ef0 | ||
![]() |
dc933a5e66 | ||
![]() |
c7699a5a3b | ||
![]() |
0f656aa7a9 | ||
![]() |
1af8481fff | ||
![]() |
93af5f8fbb | ||
![]() |
7056bbdf51 | ||
![]() |
c4eaee1e31 | ||
![]() |
4f688862a2 | ||
![]() |
3787c6ec70 | ||
![]() |
25d73a59ad | ||
![]() |
9f701d0f2e | ||
![]() |
47fb612a5a | ||
![]() |
b8ff5fed7c | ||
![]() |
3e7ff96445 | ||
![]() |
558e3b1032 | ||
![]() |
65279b3364 | ||
![]() |
d3ca184570 | ||
![]() |
40a2322e09 | ||
![]() |
0b593b343e | ||
![]() |
83dc62239f | ||
![]() |
34cb44f2be | ||
![]() |
55a82b631e | ||
![]() |
0b7e1bcfc4 | ||
![]() |
babd5336a0 | ||
![]() |
b358231b20 | ||
![]() |
4579fa52ac | ||
![]() |
b4449e4998 | ||
![]() |
d5b1dceb66 | ||
![]() |
8f46757c0d | ||
![]() |
87378fc79c | ||
![]() |
95f44cbe9a | ||
![]() |
8849ddab81 | ||
![]() |
9a47714645 | ||
![]() |
b1396b98a3 | ||
![]() |
c3433baf0c | ||
![]() |
fab692c386 | ||
![]() |
834f599fb1 | ||
![]() |
701207dcc5 | ||
![]() |
19ba37dfad | ||
![]() |
284228ef16 | ||
![]() |
ad2de3a828 | ||
![]() |
797e1a105d | ||
![]() |
9c00e7f45c | ||
![]() |
26a1b1377d | ||
![]() |
df2bb228c5 | ||
![]() |
49db47c12c | ||
![]() |
cc1e5edaec | ||
![]() |
f6060261a1 | ||
![]() |
8c73253a52 | ||
![]() |
4106645d6e | ||
![]() |
c68c35e084 | ||
![]() |
fd34b1a291 | ||
![]() |
bfc987f81b | ||
![]() |
c93c52a58c | ||
![]() |
e72c6eed24 | ||
![]() |
646e327ed2 | ||
![]() |
cb5c219ffe | ||
![]() |
3794002c7b | ||
![]() |
bd2b32bfbc | ||
![]() |
884528927e | ||
![]() |
4688b1fe23 | ||
![]() |
dfd558f848 | ||
![]() |
d2e065d273 | ||
![]() |
84a52342ab | ||
![]() |
6f3d5e9fb8 | ||
![]() |
7d18eb8b02 | ||
![]() |
7e3eb5e14d | ||
![]() |
4a76ba4376 | ||
![]() |
8245e878e3 | ||
![]() |
e64a7809e4 | ||
![]() |
28ed9879aa | ||
![]() |
d4a761ceff | ||
![]() |
7f7313d69a | ||
![]() |
6ec7dba751 | ||
![]() |
33564974b8 | ||
![]() |
baaa9f68dc | ||
![]() |
0142f8bf0c | ||
![]() |
ad534ddbb6 | ||
![]() |
673a59e4c4 | ||
![]() |
39d848c62c | ||
![]() |
35059b7507 | ||
![]() |
f698c914f6 | ||
![]() |
02cccf9e27 | ||
![]() |
54e763c71e | ||
![]() |
4c9709a2bb | ||
![]() |
297b5bc55c | ||
![]() |
ab9cb063b2 | ||
![]() |
b2b32ce67b | ||
![]() |
7aeb1ec8d9 | ||
![]() |
50b51f931e | ||
![]() |
bf353875b0 | ||
![]() |
87eab2a9b0 | ||
![]() |
dcd5197a19 | ||
![]() |
a02e12abe8 | ||
![]() |
ce17ccad27 | ||
![]() |
25f1660efc | ||
![]() |
74c7eb616f | ||
![]() |
81f1dc9839 | ||
![]() |
2269a95b99 | ||
![]() |
bf2a3ca043 | ||
![]() |
7e4becd6b6 | ||
![]() |
d400ac5705 | ||
![]() |
61e57c9373 | ||
![]() |
db1cd7dd6b | ||
![]() |
8680bcda61 | ||
![]() |
5db40a0ede | ||
![]() |
d4e80ef268 | ||
![]() |
262a4e2bfd | ||
![]() |
1037798879 | ||
![]() |
bcfdde65b0 | ||
![]() |
73d145616a | ||
![]() |
cf6380b3c7 | ||
![]() |
0593aaa0c1 | ||
![]() |
24babd47a2 | ||
![]() |
b4b24a4f70 | ||
![]() |
ad411344db | ||
![]() |
2097d2e4e4 | ||
![]() |
2a2643641e | ||
![]() |
08a081437f | ||
![]() |
b1d89175fc | ||
![]() |
97e57dcbab | ||
![]() |
f46fa72556 | ||
![]() |
242c2fc04a | ||
![]() |
1523cfdc45 | ||
![]() |
5d9b5a063b | ||
![]() |
0417c47fe2 | ||
![]() |
0da5717bb5 | ||
![]() |
73c4ec378b | ||
![]() |
1b54791905 | ||
![]() |
4299062bd0 | ||
![]() |
015ef402eb | ||
![]() |
378c6c576c | ||
![]() |
b6cb95695e | ||
![]() |
c922b49731 | ||
![]() |
60c4f86b08 | ||
![]() |
afdb8e0d37 | ||
![]() |
502a458dfd | ||
![]() |
ff986a99b6 | ||
![]() |
939c2a2494 | ||
![]() |
38234c005e | ||
![]() |
a67e5357ef | ||
![]() |
9fe4af9550 | ||
![]() |
6622611ee3 | ||
![]() |
ecb4bfde0b | ||
![]() |
1bee297bba | ||
![]() |
0e7817f7e5 | ||
![]() |
fafd1126f4 | ||
![]() |
a67f167666 | ||
![]() |
7e65648412 | ||
![]() |
003170e6d8 | ||
![]() |
28accff9ba | ||
![]() |
e1d2c576a9 | ||
![]() |
7e6722f0f8 | ||
![]() |
d909ac0e59 | ||
![]() |
2869e53421 | ||
![]() |
0b145682ba | ||
![]() |
0ef52adb18 | ||
![]() |
4b76b70ea0 | ||
![]() |
586fa99065 | ||
![]() |
26184aca10 | ||
![]() |
79ed4d5f50 | ||
![]() |
87b546e7fb | ||
![]() |
a4b8fe41c0 | ||
![]() |
8b44bf4d9b | ||
![]() |
e09b7c592c | ||
![]() |
6ea5d1a1ff | ||
![]() |
c5fa1122ae | ||
![]() |
7fa75a3d54 | ||
![]() |
358f94a7ec | ||
![]() |
07ac539c8f | ||
![]() |
c36075f4e3 | ||
![]() |
54746af5de | ||
![]() |
862e08a06c | ||
![]() |
748f70ba87 | ||
![]() |
9425f0ca1a | ||
![]() |
4a3d7002eb | ||
![]() |
6d94ccb756 | ||
![]() |
6cf83c5c1a | ||
![]() |
4bce257189 | ||
![]() |
c495fb92f3 | ||
![]() |
3102b4bdb7 | ||
![]() |
4e232602db | ||
![]() |
d5ecf1e8dd | ||
![]() |
c019cf57e5 | ||
![]() |
0db3d7ffd3 | ||
![]() |
ab846be65e | ||
![]() |
1a4e83cb5a | ||
![]() |
7cd5d5b4c3 | ||
![]() |
ec4757d6de | ||
![]() |
6447af8541 | ||
![]() |
209c1f8bc2 | ||
![]() |
6a37dfc35f | ||
![]() |
5e101a4d32 | ||
![]() |
c29ea4693d | ||
![]() |
7d0df7aa80 | ||
![]() |
db80be4d38 | ||
![]() |
146313e7db | ||
![]() |
357ac3d7fb | ||
![]() |
1275d9a185 | ||
![]() |
75f2ced937 | ||
![]() |
cd2ac25ff6 | ||
![]() |
1d603043c5 | ||
![]() |
c77f2d1569 | ||
![]() |
78e3e6bd5f | ||
![]() |
79a854e899 | ||
![]() |
4b1dbeb11f | ||
![]() |
6d235b6715 | ||
![]() |
05a95421c4 | ||
![]() |
0be654f750 | ||
![]() |
1c94a5a33d | ||
![]() |
3614015d18 | ||
![]() |
a8bffc013f | ||
![]() |
4cdac0dbe1 | ||
![]() |
74c91db35e | ||
![]() |
d06cdb5ee8 | ||
![]() |
cbb0d712dd | ||
![]() |
465a61d599 | ||
![]() |
03d8990985 | ||
![]() |
00f4db17bd | ||
![]() |
e4d9100196 | ||
![]() |
09e2381475 | ||
![]() |
af51aa81f1 | ||
![]() |
bf6fd18de8 | ||
![]() |
effa07ecc2 | ||
![]() |
cbf9ec0901 | ||
![]() |
ede18ded40 | ||
![]() |
6d14ecc60a | ||
![]() |
c2d7ac0c25 | ||
![]() |
9f2216fdc5 | ||
![]() |
7ed0fe05f3 | ||
![]() |
c4fe21e87f | ||
![]() |
74d2ccfb43 | ||
![]() |
ea685057e0 | ||
![]() |
3f150832ac | ||
![]() |
c0bce9cf97 | ||
![]() |
a446313119 | ||
![]() |
0e8e713436 | ||
![]() |
1a643126de | ||
![]() |
6fa72e4a52 | ||
![]() |
7f127ba52a | ||
![]() |
f94182e8ba | ||
![]() |
b607ab72cd | ||
![]() |
5b84b37ded | ||
![]() |
089c5874c9 | ||
![]() |
f66ab2e008 | ||
![]() |
dc7e17085d | ||
![]() |
dc4dd53771 | ||
![]() |
8193b86202 | ||
![]() |
6616c33d2a | ||
![]() |
ec6eab8a49 | ||
![]() |
bd1169a8c7 | ||
![]() |
e3e60facf9 | ||
![]() |
fc0fa3c519 | ||
![]() |
acffbe1385 | ||
![]() |
cd31384885 | ||
![]() |
9522ec43c7 | ||
![]() |
83169fbf6d | ||
![]() |
9c7629ea47 | ||
![]() |
85d1888ba7 | ||
![]() |
9e7e8ed7a6 | ||
![]() |
cbe7967310 | ||
![]() |
9e1f56c0c1 | ||
![]() |
3604971111 | ||
![]() |
c43ac4f787 | ||
![]() |
2a15f5fb51 | ||
![]() |
7cd5af5e72 | ||
![]() |
cbdfb15117 | ||
![]() |
10ccd4767a | ||
![]() |
7ba71e3b37 | ||
![]() |
670a95a01d | ||
![]() |
7eb0e9db49 | ||
![]() |
4f160ee943 | ||
![]() |
aad1c610a6 | ||
![]() |
305d14c16b | ||
![]() |
6ca9fb2440 | ||
![]() |
8581d33574 | ||
![]() |
fab1c7e986 | ||
![]() |
acea26717c | ||
![]() |
e6bcb4628a | ||
![]() |
c4f08d541d | ||
![]() |
58546751dd | ||
![]() |
5470c9a002 | ||
![]() |
8885b45259 | ||
![]() |
85632b24fc | ||
![]() |
96802c7b5c | ||
![]() |
e5207f8b42 | ||
![]() |
9d573e1b1d | ||
![]() |
dd276aabc1 | ||
![]() |
e4d0635ae1 | ||
![]() |
60f534d7a1 | ||
![]() |
8036c831a5 | ||
![]() |
942e042933 | ||
![]() |
223ddaa9bf | ||
![]() |
1d6c722c28 | ||
![]() |
9c9dd6c7bf | ||
![]() |
7ff48a6d84 | ||
![]() |
645e16fd90 | ||
![]() |
1bb58a10e2 | ||
![]() |
118788436e | ||
![]() |
0b0f7919a2 | ||
![]() |
c8e23fb6ce | ||
![]() |
bc10717f61 | ||
![]() |
e621dd3b28 | ||
![]() |
20208be556 | ||
![]() |
9074733aab | ||
![]() |
ae0ee61e7d | ||
![]() |
ac797196f5 | ||
![]() |
30aa64e9c6 | ||
![]() |
b992add77b | ||
![]() |
88ebd963f7 | ||
![]() |
96baa2978d | ||
![]() |
c01609b858 | ||
![]() |
c89f0e5547 | ||
![]() |
10dfcbf0b9 | ||
![]() |
43446d56c5 | ||
![]() |
e66f2ab36b | ||
![]() |
63def07a0e | ||
![]() |
1ba7710af8 | ||
![]() |
8f13a7ec97 | ||
![]() |
93dff5cf7a | ||
![]() |
6a0450b9f6 | ||
![]() |
fffeadd8ea | ||
![]() |
b697e058d9 | ||
![]() |
14db8b1283 | ||
![]() |
45ad8621cf | ||
![]() |
dee3a18ea8 | ||
![]() |
950cf714d9 | ||
![]() |
652184506b | ||
![]() |
89f2cd6ec0 | ||
![]() |
6457cac797 | ||
![]() |
f66c2ba171 | ||
![]() |
6133c97f45 | ||
![]() |
0dc71ce37a | ||
![]() |
c96a05a8f9 | ||
![]() |
c190dc4792 | ||
![]() |
ebf91d27c7 | ||
![]() |
63301ee771 | ||
![]() |
7da827a06a | ||
![]() |
00fc5217f5 | ||
![]() |
04e725bb50 | ||
![]() |
e6617ff8e8 | ||
![]() |
1b0a958436 | ||
![]() |
5053d470f6 | ||
![]() |
8de5c53485 | ||
![]() |
ec3ae7c7b8 | ||
![]() |
c46af7d194 | ||
![]() |
5254e85840 | ||
![]() |
5883f6e763 | ||
![]() |
c02383d7d9 | ||
![]() |
f98e5cc22d | ||
![]() |
9fbb61a744 | ||
![]() |
5191907af0 | ||
![]() |
35a69b4b1d | ||
![]() |
f947856a61 | ||
![]() |
c4967532e4 | ||
![]() |
7dc560e1f2 | ||
![]() |
ab03198ba6 | ||
![]() |
a64f520644 | ||
![]() |
5aced46345 | ||
![]() |
3cd485069d | ||
![]() |
fabb07bb28 | ||
![]() |
2328ea6d07 | ||
![]() |
0375194e7d | ||
![]() |
5a6a6bcc78 | ||
![]() |
c8f475bba1 | ||
![]() |
31f3757880 | ||
![]() |
a60a9bb144 | ||
![]() |
21a90bb7ee | ||
![]() |
6a8e38476f | ||
![]() |
2f66913813 | ||
![]() |
d9b042d9e3 | ||
![]() |
ef9044d933 | ||
![]() |
12c9dbf1bf | ||
![]() |
8cc8aa8693 | ||
![]() |
e529b16956 | ||
![]() |
ffe8d4b689 | ||
![]() |
4e5a20ec45 | ||
![]() |
7c9ef58acd | ||
![]() |
d076fe72cd | ||
![]() |
25fbbfaf94 | ||
![]() |
9df27f43de | ||
![]() |
759e9846ad | ||
![]() |
3aeba7ca8a | ||
![]() |
2a44a091c8 | ||
![]() |
4c92aebc3c | ||
![]() |
d4ecd0dfab | ||
![]() |
3f790d01fa | ||
![]() |
e7b068ed8e | ||
![]() |
bd485937c4 | ||
![]() |
8edc332a4e | ||
![]() |
bb5028364b | ||
![]() |
ef070a4e0e | ||
![]() |
6787d0224c | ||
![]() |
8a43e24095 | ||
![]() |
f879f549e4 | ||
![]() |
db55484163 | ||
![]() |
4d8f66f28e | ||
![]() |
7a44061fa3 | ||
![]() |
5d4bb42e39 | ||
![]() |
3a6c22da5c | ||
![]() |
064f0e414a | ||
![]() |
77db3cb6fa | ||
![]() |
b83a1fd102 | ||
![]() |
99c519c065 | ||
![]() |
632e52b38d | ||
![]() |
1b66ffac6c | ||
![]() |
ee9052ad3d | ||
![]() |
550c74da77 | ||
![]() |
ccdd450283 | ||
![]() |
224a607bc3 | ||
![]() |
8fcd23663c | ||
![]() |
ad79a71fbd | ||
![]() |
d862a59349 | ||
![]() |
2d6362dddb | ||
![]() |
ee3ec3a4ea | ||
![]() |
daecfd97c2 | ||
![]() |
200a81d536 | ||
![]() |
8059ac89d3 | ||
![]() |
60f5f07dd6 | ||
![]() |
372d5ce413 | ||
![]() |
6f97819ca7 | ||
![]() |
2b2ee56712 | ||
![]() |
3715326034 | ||
![]() |
6cbb8b1753 | ||
![]() |
806896ea05 | ||
![]() |
fc8746e077 | ||
![]() |
e11df5bb49 | ||
![]() |
37a9e98ebc | ||
![]() |
80b4975188 | ||
![]() |
c4ef40f4dc | ||
![]() |
6a4bb6e3e1 | ||
![]() |
05ef926a7f | ||
![]() |
0007451735 | ||
![]() |
e599de038a | ||
![]() |
61472a995f | ||
![]() |
2a41802f36 | ||
![]() |
1d1cee17c3 | ||
![]() |
e99266f9d8 | ||
![]() |
1f2cd064f7 | ||
![]() |
9c2cf9eef7 | ||
![]() |
38b0b79644 | ||
![]() |
5252834075 | ||
![]() |
162df5eb6c | ||
![]() |
ac5e2e0532 | ||
![]() |
f0ba6afbdf | ||
![]() |
04a5f43472 | ||
![]() |
a15ef4b7ce | ||
![]() |
f1f9147433 | ||
![]() |
3c0d7de377 | ||
![]() |
2a57d74f1a | ||
![]() |
79717859b3 | ||
![]() |
be423939ed | ||
![]() |
086cceb271 | ||
![]() |
a14033afb7 | ||
![]() |
cc89a342ed | ||
![]() |
25c3669564 | ||
![]() |
21eff0b2ec | ||
![]() |
472fd72c82 | ||
![]() |
429a9a42d3 | ||
![]() |
90c525e99a | ||
![]() |
196117998a | ||
![]() |
630cbc77a8 | ||
![]() |
b6e4afe321 | ||
![]() |
59085ff8c8 | ||
![]() |
a4274c6301 | ||
![]() |
b4ef44b343 | ||
![]() |
08bc97582b | ||
![]() |
3952c88510 | ||
![]() |
b1f27b9da7 | ||
![]() |
171b258d5c | ||
![]() |
af971b6a19 | ||
![]() |
7ca026393b | ||
![]() |
f8784ae3c7 | ||
![]() |
3ddc3acf4c | ||
![]() |
ff430f5e33 | ||
![]() |
daf2890161 | ||
![]() |
4ca639323d | ||
![]() |
a92bf155a3 | ||
![]() |
d153772eb2 | ||
![]() |
cdc8fe86ce | ||
![]() |
4844037ce9 | ||
![]() |
691c1e1a37 | ||
![]() |
bd55b91a86 | ||
![]() |
8842f53696 | ||
![]() |
ffed9f6116 | ||
![]() |
50e8f45601 | ||
![]() |
8cbfe9e6cf | ||
![]() |
99ad3dc292 | ||
![]() |
6908355d38 | ||
![]() |
7b948f83c3 | ||
![]() |
34b2b96158 | ||
![]() |
d1573a0a6e | ||
![]() |
16d6bda85d | ||
![]() |
4b3eb2ece5 | ||
![]() |
1089de6321 | ||
![]() |
d00dc798f4 | ||
![]() |
f6b32823ba | ||
![]() |
9e34fee58c | ||
![]() |
1684a2110c | ||
![]() |
5e00e34552 | ||
![]() |
ce204eba62 | ||
![]() |
c7cb652322 | ||
![]() |
f8ccc3128e | ||
![]() |
4a8baaef45 | ||
![]() |
a9f3939c83 | ||
![]() |
d8cb950248 | ||
![]() |
aefc51db4b | ||
![]() |
fb18ea7ff8 | ||
![]() |
407c61e212 | ||
![]() |
d8e6ad48ca | ||
![]() |
bd42f4188f | ||
![]() |
f766f383ea | ||
![]() |
1a9922d790 | ||
![]() |
6213623431 | ||
![]() |
2809ee7a3e | ||
![]() |
281cae7a18 | ||
![]() |
1670751c94 | ||
![]() |
e1ead9d2ef | ||
![]() |
359a9a96d6 | ||
![]() |
b6cfb8a3dc | ||
![]() |
6f028ecb19 | ||
![]() |
8695466690 | ||
![]() |
bdb1be9967 | ||
![]() |
9395df4cc3 | ||
![]() |
93edb333d4 | ||
![]() |
30eeef46c2 | ||
![]() |
8b584f3922 | ||
![]() |
0c354c4fdb | ||
![]() |
bd7413119a | ||
![]() |
f26915aab6 | ||
![]() |
f6068dc69d | ||
![]() |
bd2c65cd94 | ||
![]() |
4777910644 | ||
![]() |
66b26e52ce | ||
![]() |
a758267d72 | ||
![]() |
72eae64698 | ||
![]() |
d63c18f7f0 | ||
![]() |
b05e3ca8d8 | ||
![]() |
0a88100b67 | ||
![]() |
43b859f778 | ||
![]() |
d1bd7f695f | ||
![]() |
312e1378d3 | ||
![]() |
55d6825f63 | ||
![]() |
e4f9af7076 | ||
![]() |
ff52fe4884 | ||
![]() |
0ab29b7c1f | ||
![]() |
d742ed7b65 | ||
![]() |
a684e380b7 | ||
![]() |
c90feaf3db | ||
![]() |
460610f672 | ||
![]() |
46511533aa | ||
![]() |
40efed6580 | ||
![]() |
78b1c1eb4a | ||
![]() |
5a59a3dd50 | ||
![]() |
0763280196 | ||
![]() |
93f2518159 | ||
![]() |
273f731dd5 | ||
![]() |
c7cd9e86ac | ||
![]() |
41fb6f5464 | ||
![]() |
03b1a8bd41 | ||
![]() |
e7d0685ebc | ||
![]() |
aadbfe1eed | ||
![]() |
4a54fbb872 | ||
![]() |
8b1836d699 | ||
![]() |
c47d4fd35a | ||
![]() |
a58af1275c | ||
![]() |
1d63b39553 | ||
![]() |
c300d52b29 | ||
![]() |
5314e275bc | ||
![]() |
08f8b9770a | ||
![]() |
a9c64b2fec | ||
![]() |
1edfa78a05 | ||
![]() |
1df8af35d4 | ||
![]() |
f47c5e53b1 | ||
![]() |
a48cbc6971 | ||
![]() |
73be8cf074 | ||
![]() |
002a1412cb | ||
![]() |
049cd2d236 | ||
![]() |
e99714eba6 | ||
![]() |
4e1423d224 | ||
![]() |
4751075e87 | ||
![]() |
416e0fb609 | ||
![]() |
f96a371464 | ||
![]() |
e423192265 | ||
![]() |
e9444e058c | ||
![]() |
037632fbf0 | ||
![]() |
6cdea85a49 | ||
![]() |
f86d755890 | ||
![]() |
98cc97251a | ||
![]() |
562f414e3e | ||
![]() |
1afc301432 | ||
![]() |
115b44585b | ||
![]() |
3ff47623d5 | ||
![]() |
943e03f9d8 | ||
![]() |
f7a534a0d0 | ||
![]() |
72e30d8e40 | ||
![]() |
eb265300fc | ||
![]() |
704b8f61dd | ||
![]() |
40957c445f | ||
![]() |
8eead9fda2 | ||
![]() |
aadc8168be | ||
![]() |
cb33f04bfc | ||
![]() |
82cb71bf3f | ||
![]() |
c37b88a239 | ||
![]() |
de59bf695d | ||
![]() |
592627b013 | ||
![]() |
9ed1fb2588 | ||
![]() |
8232a92653 | ||
![]() |
09eeaa92d1 | ||
![]() |
1e4b1a2c70 | ||
![]() |
0a1e7a7c86 | ||
![]() |
e5f3b2bf6e | ||
![]() |
29183c10ff | ||
![]() |
46b8bdace7 | ||
![]() |
9b6924ec9f | ||
![]() |
c69de107e5 | ||
![]() |
c4d451e420 | ||
![]() |
be6bce5771 | ||
![]() |
9bcccc87e6 | ||
![]() |
bf845be727 | ||
![]() |
e92a5414d1 | ||
![]() |
657125f43c | ||
![]() |
e98f68e93b | ||
![]() |
bef84e9eec | ||
![]() |
6a5f2402c7 | ||
![]() |
039a8e0b87 | ||
![]() |
d6cc6ba144 | ||
![]() |
07f8dcb3ca | ||
![]() |
a026143a84 | ||
![]() |
73a5b6738d | ||
![]() |
3e2b12ae4a | ||
![]() |
8073364b7a | ||
![]() |
b141d96e7c | ||
![]() |
a86e8b98fe | ||
![]() |
a7d77716f3 | ||
![]() |
b017e439b1 | ||
![]() |
a7156f665a | ||
![]() |
44e34d084e | ||
![]() |
065820ffa4 | ||
![]() |
26991928ae | ||
![]() |
f4fa68c390 | ||
![]() |
8b86f9ea6d | ||
![]() |
48f966e7db | ||
![]() |
d8746dc592 | ||
![]() |
6421d3017e | ||
![]() |
f9e771f8f7 | ||
![]() |
09456ce421 | ||
![]() |
716f7e722b | ||
![]() |
ffa4b1483f | ||
![]() |
76f7165462 | ||
![]() |
fdf0d8e9c8 | ||
![]() |
6651aa924f | ||
![]() |
369fd95e2b | ||
![]() |
e242adec66 | ||
![]() |
58e562f7d4 | ||
![]() |
70238fd773 | ||
![]() |
fc4e007cc4 | ||
![]() |
b7667ce97a | ||
![]() |
1315da0da7 | ||
![]() |
a8b5534838 | ||
![]() |
2581fa4176 | ||
![]() |
d90b1ca5be | ||
![]() |
c4d8eae547 | ||
![]() |
b01fc1be62 | ||
![]() |
c46e3cf5cb | ||
![]() |
1a6b915112 | ||
![]() |
2f38943488 | ||
![]() |
06711dc6c3 | ||
![]() |
cc7e342ab7 | ||
![]() |
5b64743987 | ||
![]() |
a84ad031d9 | ||
![]() |
c4c2fe2a9c | ||
![]() |
8ccaef454c | ||
![]() |
27579dff37 | ||
![]() |
389d08c233 | ||
![]() |
5412a087fe | ||
![]() |
dd0f3ac651 | ||
![]() |
4d4d776e4d | ||
![]() |
7877b107c1 | ||
![]() |
a2aa0aa9a8 | ||
![]() |
b3475d30c0 | ||
![]() |
6484c8d636 | ||
![]() |
587cf554f2 | ||
![]() |
1d4e4eb6b3 | ||
![]() |
31c4ed7d0e | ||
![]() |
7f246b2d3d | ||
![]() |
7d68cff700 | ||
![]() |
4d80bdcc9f | ||
![]() |
8b4a94e5aa | ||
![]() |
111ad14ad3 | ||
![]() |
aec3f19d23 | ||
![]() |
d8b80f961a | ||
![]() |
891bb7fa40 | ||
![]() |
0e3af45466 | ||
![]() |
6aebbc3109 | ||
![]() |
15eb7f3186 | ||
![]() |
fb4cd98014 | ||
![]() |
eb692dea59 | ||
![]() |
d8039fb542 | ||
![]() |
5e06d19d77 | ||
![]() |
963f390336 | ||
![]() |
2309e15261 | ||
![]() |
8491035b2f | ||
![]() |
4d4107aefc | ||
![]() |
67d2b9131e | ||
![]() |
da8644168c | ||
![]() |
c0004e988a | ||
![]() |
b9187445e0 | ||
![]() |
554ebf7ab9 | ||
![]() |
3e54cd7284 | ||
![]() |
a7afc23a9a | ||
![]() |
fa3a047519 | ||
![]() |
f24fab0fa2 | ||
![]() |
261620fd13 | ||
![]() |
9af6effad9 | ||
![]() |
92602916dd | ||
![]() |
f4d215664e | ||
![]() |
84894a557a | ||
![]() |
ffad6e4c61 | ||
![]() |
93b266e6be | ||
![]() |
f92ea28581 | ||
![]() |
85213e4b6c | ||
![]() |
4e46119e18 | ||
![]() |
fdc6e9f1c3 | ||
![]() |
cb20f1e212 | ||
![]() |
e3fccd7125 | ||
![]() |
15142c1ec3 | ||
![]() |
6c7b90e1c3 | ||
![]() |
d8e57144f7 | ||
![]() |
49fe8a427a | ||
![]() |
4587428d13 | ||
![]() |
5318e77035 | ||
![]() |
e69c45a246 | ||
![]() |
3f87a6d714 | ||
![]() |
841124b1f3 | ||
![]() |
257a878ef4 | ||
![]() |
07d3f82912 | ||
![]() |
7d3eb4f5a6 | ||
![]() |
0efcc55373 | ||
![]() |
eafceb8a6c | ||
![]() |
5ac8318e71 | ||
![]() |
7981f9dc91 | ||
![]() |
a9bf04cbc6 | ||
![]() |
4b5591d884 | ||
![]() |
c08197f025 | ||
![]() |
5d22eabfa3 | ||
![]() |
c3a38e384a | ||
![]() |
0d3dd94559 | ||
![]() |
9cdaa37519 | ||
![]() |
202a319d69 | ||
![]() |
198384b2ed | ||
![]() |
9d8b070f1e | ||
![]() |
28ba2d5008 | ||
![]() |
37ddd63d27 | ||
![]() |
d7f8b8c1e0 | ||
![]() |
9e70c5bbea | ||
![]() |
4dd572063e | ||
![]() |
db9cf95648 | ||
![]() |
df6bae4712 | ||
![]() |
56cb8209b8 | ||
![]() |
aba9c2e113 | ||
![]() |
3d25008739 | ||
![]() |
9437f057d0 | ||
![]() |
917d6089a7 | ||
![]() |
f19e99e3ad | ||
![]() |
2d0fb05fa6 | ||
![]() |
c617f2dfad | ||
![]() |
747c5fc89a | ||
![]() |
4f662ef203 | ||
![]() |
eb274ad88f | ||
![]() |
bd7b41be9b | ||
![]() |
076720bfff | ||
![]() |
2aadae407e | ||
![]() |
b16bb07774 | ||
![]() |
81dd083388 | ||
![]() |
92d4cef1e2 | ||
![]() |
0cb5197ccf | ||
![]() |
d2cd79dcf5 | ||
![]() |
0ef8b391e4 | ||
![]() |
0fbd105977 | ||
![]() |
5c23af541e | ||
![]() |
db021ff78b | ||
![]() |
31294c6f54 | ||
![]() |
03d3495759 | ||
![]() |
4644e105a8 | ||
![]() |
af5002508d | ||
![]() |
9416d2b9c7 | ||
![]() |
f60f5d5a6c | ||
![]() |
26d00f87a8 | ||
![]() |
6c33ea423c | ||
![]() |
ad354aca4e | ||
![]() |
ce6a5ebf0a | ||
![]() |
d66ef38e8d | ||
![]() |
1b6c49f621 | ||
![]() |
0262c83815 | ||
![]() |
c212934130 | ||
![]() |
ac30e47e59 | ||
![]() |
d640057453 | ||
![]() |
0cea136d4d | ||
![]() |
9b3d93e734 | ||
![]() |
ca3782ac62 | ||
![]() |
dc9ffb7fd5 | ||
![]() |
b21b3a55fe | ||
![]() |
e62bd85a7a | ||
![]() |
fed221b008 | ||
![]() |
935298d159 | ||
![]() |
909919250c | ||
![]() |
d24f278f7c | ||
![]() |
ca408a495c | ||
![]() |
ee99719137 | ||
![]() |
5fb0729eae | ||
![]() |
a1db3187cd | ||
![]() |
488a3cf1ff | ||
![]() |
1253a620a4 | ||
![]() |
64547fc4a7 | ||
![]() |
d643d140cf | ||
![]() |
222e2e3242 | ||
![]() |
ea7b6daf26 | ||
![]() |
14cfab495d | ||
![]() |
ed4b4a1a3c | ||
![]() |
511c552188 | ||
![]() |
8c650219eb | ||
![]() |
189b779abe | ||
![]() |
c26074b184 | ||
![]() |
6c70779ff1 | ||
![]() |
73897481ac | ||
![]() |
a62c523ed5 | ||
![]() |
0f46f57b52 | ||
![]() |
bc4d65a20c | ||
![]() |
f1e9a44ad9 | ||
![]() |
61972c4719 | ||
![]() |
9183c9c220 | ||
![]() |
1ce59f13ff | ||
![]() |
1bac5db6d5 | ||
![]() |
58f2c4d8e6 | ||
![]() |
2c2c61b2fc | ||
![]() |
98b04a4a83 | ||
![]() |
3ac64c44f4 | ||
![]() |
3375847302 | ||
![]() |
14043c86f5 | ||
![]() |
030117780a | ||
![]() |
971c9fe5a1 | ||
![]() |
77c6d3d576 | ||
![]() |
6edbfe2a6f | ||
![]() |
d0a3125df4 | ||
![]() |
d8c76d4c21 | ||
![]() |
a1cc0897df | ||
![]() |
e88a90f242 | ||
![]() |
1ae54f6f8c | ||
![]() |
8a4cb484fa | ||
![]() |
93defbf341 | ||
![]() |
ca1089da9a | ||
![]() |
dd07c7db0e | ||
![]() |
dfe932e37a | ||
![]() |
568cf9c259 | ||
![]() |
b4ef20e785 | ||
![]() |
3a56dabf42 | ||
![]() |
3ac4899b96 | ||
![]() |
b7b228d9ce | ||
![]() |
45339fd6d2 | ||
![]() |
1856a5a82f | ||
![]() |
b2aa703b62 | ||
![]() |
b31897d65d | ||
![]() |
a92f776ebe | ||
![]() |
b84ed675f5 | ||
![]() |
21eb98a52c | ||
![]() |
75dd8d492b | ||
![]() |
338893ded4 | ||
![]() |
b459900040 | ||
![]() |
d31300f4f9 | ||
![]() |
f2285c0b19 | ||
![]() |
684cb81974 | ||
![]() |
9db272f30e | ||
![]() |
c4a5e8dc86 | ||
![]() |
df4dd0122f | ||
![]() |
8fed18b2ac | ||
![]() |
ecabbb57e6 | ||
![]() |
8d1d4092aa | ||
![]() |
6185c4ddcf | ||
![]() |
3ccbbccd10 | ||
![]() |
30e0ccc77b | ||
![]() |
50f7b72b09 | ||
![]() |
a5828c7949 | ||
![]() |
22a5e72470 | ||
![]() |
5d14dca818 | ||
![]() |
f97cb821f8 | ||
![]() |
d02dce5562 | ||
![]() |
c6bd42843b | ||
![]() |
43e4fbfcd0 | ||
![]() |
ac8430cbba | ||
![]() |
86d619be30 | ||
![]() |
fec7672598 | ||
![]() |
44d2744a8c | ||
![]() |
22bfbe96c8 | ||
![]() |
c0aca723da | ||
![]() |
28e5ee51ec | ||
![]() |
c5d1271894 | ||
![]() |
050d3058f9 | ||
![]() |
2ae99afa21 | ||
![]() |
b094c9190f | ||
![]() |
1a9e1e6f7c | ||
![]() |
8c94926693 | ||
![]() |
880a176e65 | ||
![]() |
8de1b5f3d9 | ||
![]() |
178f4546fc | ||
![]() |
7564a49344 | ||
![]() |
6c5c42c2b5 | ||
![]() |
b1653b359e | ||
![]() |
11098afab5 | ||
![]() |
a64051e0f1 | ||
![]() |
db8ac4a9ae | ||
![]() |
890474a635 | ||
![]() |
c7941a85ed | ||
![]() |
fab5f26e09 | ||
![]() |
a39b10eee9 | ||
![]() |
97b933a990 | ||
![]() |
4926e90514 | ||
![]() |
6dca975844 | ||
![]() |
e31743770a | ||
![]() |
d8aab62d75 | ||
![]() |
f90603a18f | ||
![]() |
5fce9facbe | ||
![]() |
32b48d5cdb | ||
![]() |
3e4f0d682b | ||
![]() |
98449ddfe0 | ||
![]() |
26040d4e9f | ||
![]() |
7ab10aeb80 | ||
![]() |
9316962e47 | ||
![]() |
845663f80f | ||
![]() |
83cea5e1ee | ||
![]() |
3e73a5dbd3 | ||
![]() |
dd424a4cb3 | ||
![]() |
0c79f5cce3 | ||
![]() |
794c3703e5 | ||
![]() |
b674006fcc | ||
![]() |
505c528194 | ||
![]() |
9530af95f4 | ||
![]() |
559c397b2f | ||
![]() |
c1efa78820 | ||
![]() |
646698f1ed | ||
![]() |
d61797fa3a | ||
![]() |
c9b938ae55 | ||
![]() |
e4409e8ea4 | ||
![]() |
990c220fa0 | ||
![]() |
38641d4edf | ||
![]() |
450072bd23 | ||
![]() |
25eb93fae0 | ||
![]() |
bcf6f60571 | ||
![]() |
2076b8f1d7 | ||
![]() |
f19cfb75e6 | ||
![]() |
ceaacc771d | ||
![]() |
48067e3285 | ||
![]() |
003855a94c | ||
![]() |
3599ab3caf | ||
![]() |
e7a26b436d | ||
![]() |
ab94bc18dc | ||
![]() |
36e91ea155 | ||
![]() |
6035be9ce6 | ||
![]() |
67499bdc65 | ||
![]() |
222c8fdb62 | ||
![]() |
9d648bad51 | ||
![]() |
1a62b9a161 | ||
![]() |
33021e8fe0 | ||
![]() |
5a2ae4c3e3 | ||
![]() |
9eaef84cc8 | ||
![]() |
fcc4d655f5 | ||
![]() |
8d0ac4f5f0 | ||
![]() |
d56cf003f8 | ||
![]() |
34d0c0b1ba | ||
![]() |
9bbbffbe7a | ||
![]() |
ccd0f7d9cc | ||
![]() |
ccb9bceecc | ||
![]() |
c1a67ff1f8 | ||
![]() |
bfda8dcc02 | ||
![]() |
8746e7c9ad | ||
![]() |
e2aa36d083 | ||
![]() |
ff90f257cc | ||
![]() |
9b84046865 | ||
![]() |
51434a39f8 | ||
![]() |
3e2031be7c | ||
![]() |
ea4e8805b7 | ||
![]() |
f62bfeac08 | ||
![]() |
b9042c37f9 | ||
![]() |
49a58dcab1 | ||
![]() |
e2acbeddc2 | ||
![]() |
449b17d830 | ||
![]() |
7ed460ce02 | ||
![]() |
9f4a7e664f | ||
![]() |
38eb75b13f | ||
![]() |
0ad56874b4 | ||
![]() |
c1168693fa | ||
![]() |
feb8c27f1f | ||
![]() |
c20ebd66e5 | ||
![]() |
4d78d530dc | ||
![]() |
22b20c15de | ||
![]() |
c69b224c65 | ||
![]() |
805d328d6c | ||
![]() |
edcb692f78 | ||
![]() |
f33586f062 | ||
![]() |
b8293f134d | ||
![]() |
7e9bcff0f3 | ||
![]() |
eba3b32708 | ||
![]() |
d61bf26e17 | ||
![]() |
2e662b5745 | ||
![]() |
9714fa369b | ||
![]() |
0e8acba08e | ||
![]() |
a18e588e55 | ||
![]() |
bf55e3c0cc | ||
![]() |
486d114e64 | ||
![]() |
ac5c060a98 | ||
![]() |
86a9d197cb | ||
![]() |
e911dbb9d4 | ||
![]() |
e26d123f67 | ||
![]() |
70aac81900 | ||
![]() |
28e78d98f6 | ||
![]() |
fabc5ae032 | ||
![]() |
e40882455d | ||
![]() |
f1483e8c8e | ||
![]() |
bd40e2c3ff | ||
![]() |
9479498713 | ||
![]() |
6bd8523ec2 | ||
![]() |
22e3cddd91 | ||
![]() |
c864b15c34 | ||
![]() |
069654c5f9 | ||
![]() |
f3d4d4747a | ||
![]() |
5bbb0cd666 | ||
![]() |
7b5ba3bdc2 | ||
![]() |
5ac17ee6b8 | ||
![]() |
d647555e3a | ||
![]() |
26e22f97ee | ||
![]() |
84976a65e0 | ||
![]() |
fef9d541ed | ||
![]() |
ad5535af81 | ||
![]() |
cdcfb4ffce | ||
![]() |
5403ac8893 | ||
![]() |
9b26457781 | ||
![]() |
939cc56951 | ||
![]() |
23309e6fdf | ||
![]() |
3f60c961d9 | ||
![]() |
9e7f07e196 | ||
![]() |
eda4439ee8 | ||
![]() |
ad02558ade | ||
![]() |
0d1901cfe5 | ||
![]() |
ce493d1ae2 | ||
![]() |
09312ecd1d | ||
![]() |
2f274d5f52 | ||
![]() |
6dbf226365 | ||
![]() |
6401b5f54d | ||
![]() |
ac2dd81d39 | ||
![]() |
6784522195 | ||
![]() |
f42d077f30 | ||
![]() |
eaca47ebc6 | ||
![]() |
4d57223847 | ||
![]() |
d9ab96236b | ||
![]() |
44b2e62eef | ||
![]() |
7d5d4df761 | ||
![]() |
da7716db60 | ||
![]() |
862c5d342b | ||
![]() |
6167d5dbfc | ||
![]() |
2856fb029f | ||
![]() |
8fb945312a | ||
![]() |
25d6806ebd | ||
![]() |
51070d9afd | ||
![]() |
1048caa496 | ||
![]() |
0cd7ac05aa | ||
![]() |
2793c42d91 | ||
![]() |
2eaa7288e4 | ||
![]() |
f9341bea79 | ||
![]() |
0df8d13020 | ||
![]() |
d27622de1e | ||
![]() |
47c3da131c | ||
![]() |
3a608bb582 | ||
![]() |
64f9228ee3 | ||
![]() |
c926482b3c | ||
![]() |
9562972c42 | ||
![]() |
b462b7fcc4 | ||
![]() |
b34f9d7fd3 | ||
![]() |
57732c3e5f | ||
![]() |
eb1f56488f | ||
![]() |
5825843f68 | ||
![]() |
dd56a5d869 | ||
![]() |
86f82c0e61 | ||
![]() |
8ae45240b2 | ||
![]() |
6d845af7f1 | ||
![]() |
733ebb8caf | ||
![]() |
695a194467 | ||
![]() |
8a56257ade | ||
![]() |
45fea983b9 | ||
![]() |
642b499e70 | ||
![]() |
5c5575bb72 | ||
![]() |
4d5dc0d39c | ||
![]() |
fba0a8036b | ||
![]() |
d82274f5d4 | ||
![]() |
3cf81230b2 | ||
![]() |
17bab456e4 | ||
![]() |
e1cc006db7 | ||
![]() |
7e95dd3c76 | ||
![]() |
ff3ce46a26 | ||
![]() |
4d61c2c5e0 | ||
![]() |
8589ee14ff | ||
![]() |
1727387c9c | ||
![]() |
e1146e4655 | ||
![]() |
afaba7ccdf | ||
![]() |
ccb3ceae4f | ||
![]() |
d0d93f6d2d | ||
![]() |
67f091c731 | ||
![]() |
c29b0645bd | ||
![]() |
96dac0f979 | ||
![]() |
fda9b59129 | ||
![]() |
fa3aebb7b1 | ||
![]() |
988251deb6 | ||
![]() |
d99a389c49 | ||
![]() |
7508f9d3bb | ||
![]() |
b2512d7aee | ||
![]() |
eb74e1e3b2 | ||
![]() |
bd91e82b17 | ||
![]() |
bae60acfe7 | ||
![]() |
426cefe8ee | ||
![]() |
a36fe3ef21 | ||
![]() |
ee0756c7c0 | ||
![]() |
44b96121e4 | ||
![]() |
8add777b34 | ||
![]() |
6932b15144 | ||
![]() |
c09edda797 | ||
![]() |
0e86010565 | ||
![]() |
fa5896ee5b | ||
![]() |
6fe3fdce11 | ||
![]() |
90769a12b1 | ||
![]() |
3c6d27b504 | ||
![]() |
6ef25eb861 | ||
![]() |
ec28e972bb | ||
![]() |
d1a9033525 | ||
![]() |
2d5bc3ada8 | ||
![]() |
506ffb9885 | ||
![]() |
8ef702fa07 | ||
![]() |
1d49b725b6 | ||
![]() |
204feb97ce | ||
![]() |
e12389a748 | ||
![]() |
9fc38b5bb8 | ||
![]() |
907e5a10d6 | ||
![]() |
670591e221 | ||
![]() |
8006a7d578 | ||
![]() |
8b9078b82e | ||
![]() |
56d4edd3ae | ||
![]() |
a7f5ea865e | ||
![]() |
2a62144abd | ||
![]() |
c7ea7a4f65 | ||
![]() |
7ea090ba8d | ||
![]() |
9294e353d3 | ||
![]() |
71c50c58ee | ||
![]() |
e322299fda | ||
![]() |
06602a568a | ||
![]() |
54ac5e8940 | ||
![]() |
e2341363d4 | ||
![]() |
a0f0529ad8 | ||
![]() |
c371d863d9 | ||
![]() |
16d8c75953 | ||
![]() |
fa48c0e76b | ||
![]() |
cc6989b4f9 | ||
![]() |
fc31458cc4 | ||
![]() |
2d17cfaf2b | ||
![]() |
f379de0a3a | ||
![]() |
d3fcb0aa6a | ||
![]() |
046740f10b | ||
![]() |
ffae2eda83 | ||
![]() |
8334b8fe46 | ||
![]() |
c6c6e58d28 | ||
![]() |
2ff0d6665c | ||
![]() |
dc6108c970 | ||
![]() |
6f52f9b4af | ||
![]() |
b6eb896f0b | ||
![]() |
adf861c36d | ||
![]() |
4e1bcdf209 | ||
![]() |
d107fe19f7 | ||
![]() |
fa03ff51d4 | ||
![]() |
f6c6536b48 | ||
![]() |
38e4249182 | ||
![]() |
2dd8c0beee | ||
![]() |
6a35494ef1 | ||
![]() |
bf1c42e085 | ||
![]() |
f1aa3d8c90 | ||
![]() |
0ef6bf8067 | ||
![]() |
9d63e2ae97 | ||
![]() |
fdd8060296 | ||
![]() |
ebbb23ffbb | ||
![]() |
0e413109bd | ||
![]() |
f7e29c1e00 | ||
![]() |
42f777d49a | ||
![]() |
efb8ea4c25 | ||
![]() |
52bf5690c0 | ||
![]() |
607dff9263 | ||
![]() |
0510db75fb | ||
![]() |
cf3e53eb71 | ||
![]() |
b8865e925d | ||
![]() |
2e9a860aaa | ||
![]() |
859eecabc0 | ||
![]() |
7a0253631b | ||
![]() |
c12a60c1ad | ||
![]() |
df9dbd6130 | ||
![]() |
a98e745116 | ||
![]() |
61f1b10a06 | ||
![]() |
4bcb2a5c9d | ||
![]() |
7e48648f9e | ||
![]() |
e4bef056e6 | ||
![]() |
bcc97d1aa7 | ||
![]() |
49f9d36718 | ||
![]() |
f9cb258a5e | ||
![]() |
803b8eab28 | ||
![]() |
08bbfc50ee | ||
![]() |
97381a4908 | ||
![]() |
4e6722f201 | ||
![]() |
a29e2116a7 | ||
![]() |
7a15acc546 | ||
![]() |
0265de2137 | ||
![]() |
595b9910f5 | ||
![]() |
f4d4d2cc35 | ||
![]() |
b4fb4d7dcf | ||
![]() |
1a375fb523 | ||
![]() |
658c0ff5c4 | ||
![]() |
515be677a9 | ||
![]() |
d694c5f511 | ||
![]() |
66c753f3a3 | ||
![]() |
7047b62442 | ||
![]() |
6092f06d46 | ||
![]() |
4671b956b3 | ||
![]() |
552ba6999a | ||
![]() |
b86bc4455f | ||
![]() |
b6d36ee117 | ||
![]() |
5cc73555cd | ||
![]() |
219922cd82 | ||
![]() |
5d57f864dc | ||
![]() |
c6ee2816db | ||
![]() |
0aa898b13f | ||
![]() |
b22e82c8ce | ||
![]() |
63dee1e1ac | ||
![]() |
91c87ac301 | ||
![]() |
7124d9bca5 | ||
![]() |
08127e5806 | ||
![]() |
6417bd91ef | ||
![]() |
cde5f7d12e | ||
![]() |
395c9587b6 | ||
![]() |
17197ad670 | ||
![]() |
42371a6e8d | ||
![]() |
d7aae849f6 | ||
![]() |
4fe9413662 | ||
![]() |
37bf51cebf | ||
![]() |
eee9cb8b87 | ||
![]() |
1724bca5f0 | ||
![]() |
ae6581fb55 | ||
![]() |
0c632307ea | ||
![]() |
479887eb84 | ||
![]() |
af280a7343 | ||
![]() |
802b26e870 | ||
![]() |
0ab86937d2 | ||
![]() |
3ab06bf383 | ||
![]() |
5db0cc5241 | ||
![]() |
a588ec084b | ||
![]() |
5660b5ddc6 | ||
![]() |
27fbe69033 | ||
![]() |
1672ecb892 | ||
![]() |
784e01347c | ||
![]() |
5cc21a831b | ||
![]() |
dcb9380b50 | ||
![]() |
b1957773bb | ||
![]() |
c4f4583f20 | ||
![]() |
440cdbdb23 | ||
![]() |
58bfde33a9 | ||
![]() |
7c33e49ef6 | ||
![]() |
3bf318e2b7 | ||
![]() |
f56193ac18 | ||
![]() |
31efa7a8f8 | ||
![]() |
372932abaf | ||
![]() |
4c6dd2cdf2 | ||
![]() |
6d04e39151 | ||
![]() |
afa257e79a | ||
![]() |
05f8ee9747 | ||
![]() |
818ae03928 | ||
![]() |
97ad3c1e6d | ||
![]() |
97555645f8 | ||
![]() |
612228bb73 | ||
![]() |
e350f43adc | ||
![]() |
2257f3484d | ||
![]() |
6e75d41956 | ||
![]() |
9883a38698 | ||
![]() |
07256e2e34 | ||
![]() |
43674ae80a | ||
![]() |
f4ba8df02b | ||
![]() |
c066ebd76f | ||
![]() |
6e382c64a4 | ||
![]() |
99ebf03876 | ||
![]() |
995d79e373 | ||
![]() |
0cd153ab61 | ||
![]() |
81e76f260c | ||
![]() |
b24baa68ba | ||
![]() |
d4c1b8d321 | ||
![]() |
1e53d6bfab | ||
![]() |
5931cd6af7 | ||
![]() |
a1be03543c | ||
![]() |
b1a5547de2 | ||
![]() |
93571961ee | ||
![]() |
ee4942dfd7 | ||
![]() |
cb24347b23 | ||
![]() |
146b7be825 | ||
![]() |
50203c5f87 | ||
![]() |
b188073fb0 | ||
![]() |
8aef24be1e | ||
![]() |
fb25f6c7ac | ||
![]() |
fbd983217d | ||
![]() |
ce21fe2087 | ||
![]() |
17cd395712 | ||
![]() |
bfe9de05cd | ||
![]() |
91c60df0e9 | ||
![]() |
ad065e9281 | ||
![]() |
b1429366da | ||
![]() |
8bf7af2e74 | ||
![]() |
2003f51d49 | ||
![]() |
ce83fd9a10 | ||
![]() |
eacbaa3680 | ||
![]() |
98c65fb9b7 | ||
![]() |
44a71d8565 | ||
![]() |
badd4d3207 | ||
![]() |
0f517b803b | ||
![]() |
c2d11e786f | ||
![]() |
b0efe49e29 | ||
![]() |
2d029b9f76 | ||
![]() |
8ad917cff0 | ||
![]() |
4e478c65d3 | ||
![]() |
a469086915 | ||
![]() |
bf05ff6048 | ||
![]() |
a817d8cbf9 | ||
![]() |
4a19c78fa5 | ||
![]() |
e8bb7da906 | ||
![]() |
523477fc2b | ||
![]() |
c730426be0 | ||
![]() |
57d6c97203 | ||
![]() |
fce17aa1d4 | ||
![]() |
01abc244b1 | ||
![]() |
7bedacf5ad | ||
![]() |
552a1d0464 | ||
![]() |
8dde25532a | ||
![]() |
f29fa939ab | ||
![]() |
614bdb33b4 | ||
![]() |
71761675cf | ||
![]() |
d9194aa859 | ||
![]() |
f15081a474 | ||
![]() |
2f99ff4a0c | ||
![]() |
3a7d26aa46 | ||
![]() |
3f35bc593c | ||
![]() |
e5e708d781 | ||
![]() |
d694561980 | ||
![]() |
8d6d18e875 | ||
![]() |
072e27ed27 | ||
![]() |
6d64215614 | ||
![]() |
33f5ed5b14 | ||
![]() |
27f509c8e0 | ||
![]() |
890b3e13c9 | ||
![]() |
b730cb099f | ||
![]() |
fc94f184d2 | ||
![]() |
cbf6540889 | ||
![]() |
40804a7fb3 | ||
![]() |
d4101c4f43 | ||
![]() |
409bebd5bc | ||
![]() |
8e3ad69adb | ||
![]() |
c8e46d9e21 | ||
![]() |
c56241ffc1 | ||
![]() |
be62a2bfc5 | ||
![]() |
5cb7771484 | ||
![]() |
6675d3e2cd | ||
![]() |
8ecbe4c8ad | ||
![]() |
edb75c4bab | ||
![]() |
54b21c716a | ||
![]() |
4704274b87 | ||
![]() |
78547aa119 | ||
![]() |
3887231c73 | ||
![]() |
8a29cfbb7e | ||
![]() |
a01d6eaf72 | ||
![]() |
69fc571b56 | ||
![]() |
4cfd9c322b | ||
![]() |
4326354ca6 | ||
![]() |
4208c852e1 | ||
![]() |
7330b4532e | ||
![]() |
1e0f6f9e41 | ||
![]() |
216e2367c6 | ||
![]() |
d2dce8801b | ||
![]() |
5b8bb9f678 | ||
![]() |
2076f146cf | ||
![]() |
910c10f554 | ||
![]() |
04e974b326 | ||
![]() |
e7abeb5ad9 | ||
![]() |
f4416fe007 | ||
![]() |
510591ef0f | ||
![]() |
a5e89d1dd1 | ||
![]() |
5d4f2b7862 | ||
![]() |
e3815e40d2 | ||
![]() |
6dccfb4774 | ||
![]() |
1ccc1f4c1a | ||
![]() |
042809620a | ||
![]() |
cb4c8abd94 | ||
![]() |
e86302f5b9 | ||
![]() |
de080d5811 | ||
![]() |
21b7045f93 | ||
![]() |
627301f83d | ||
![]() |
607ca84fcc | ||
![]() |
a7f36248d0 | ||
![]() |
d008d15167 | ||
![]() |
607dc436bd | ||
![]() |
4384948f6c | ||
![]() |
5e05e9ec93 | ||
![]() |
ac1fe66cf9 | ||
![]() |
2a18eacf62 | ||
![]() |
af42e32ae6 | ||
![]() |
12b93d6637 | ||
![]() |
930c971035 | ||
![]() |
06f20c66f8 | ||
![]() |
7c875a8541 | ||
![]() |
f85e19c75d | ||
![]() |
5e2aa51627 | ||
![]() |
75a44fb30a | ||
![]() |
86732b6ae4 | ||
![]() |
0713f55e9c | ||
![]() |
5c32d73409 | ||
![]() |
5e13a1735d | ||
![]() |
6a1fbb00d9 | ||
![]() |
20c3badfac | ||
![]() |
7817cfe0c1 | ||
![]() |
9ed823b5a5 | ||
![]() |
c6a5dedf0a | ||
![]() |
01c9ab36b7 | ||
![]() |
27f5bdeef1 | ||
![]() |
723898f87d | ||
![]() |
bc05cc1445 | ||
![]() |
dcf4e43e28 | ||
![]() |
3868c53908 | ||
![]() |
a71c693ca3 | ||
![]() |
691f93f01c | ||
![]() |
4cff749186 | ||
![]() |
e1ac1547fd | ||
![]() |
e53bd505fb | ||
![]() |
cfa926542e | ||
![]() |
79097eca47 | ||
![]() |
d1741e40e3 | ||
![]() |
5d0528d195 | ||
![]() |
a9ea06f753 | ||
![]() |
62e121c12c | ||
![]() |
02ef05160f | ||
![]() |
6e66c013c0 | ||
![]() |
dcb11f01e1 | ||
![]() |
8a0e4b577c | ||
![]() |
b57f420261 | ||
![]() |
7d1790abe3 | ||
![]() |
1fc494571b | ||
![]() |
e6d97bc773 | ||
![]() |
0e53323fb7 | ||
![]() |
eb4764d2b2 | ||
![]() |
298a91adbf | ||
![]() |
2cb9912039 | ||
![]() |
e52bfe4335 | ||
![]() |
761a249e05 | ||
![]() |
c42df3a0c2 | ||
![]() |
3d359b7a98 | ||
![]() |
deef6417ad | ||
![]() |
f55a8deb97 | ||
![]() |
333506e00b | ||
![]() |
bbc1642b90 | ||
![]() |
8209eda27a | ||
![]() |
b13f7a599b | ||
![]() |
cb0f700be1 | ||
![]() |
7b6d6b466a | ||
![]() |
76f97e5c2e | ||
![]() |
4669a1ab57 | ||
![]() |
b1ad0edbe1 | ||
![]() |
51a695d047 | ||
![]() |
396e2d14f3 | ||
![]() |
245479c339 | ||
![]() |
092215f47a | ||
![]() |
fcb46db718 | ||
![]() |
60c58c8b9c | ||
![]() |
124a2839b5 | ||
![]() |
ededfe10ab | ||
![]() |
81895c20d6 | ||
![]() |
46fabe065c | ||
![]() |
7ac338756a | ||
![]() |
640b8edd78 | ||
![]() |
c5d98752fa | ||
![]() |
a6a5bef447 | ||
![]() |
042885c155 | ||
![]() |
cbb9dcf7d0 | ||
![]() |
9b080800e1 | ||
![]() |
6effbf50a8 | ||
![]() |
398f9aa19a | ||
![]() |
935d89747f | ||
![]() |
21c2fbfd39 | ||
![]() |
bd337f3aac | ||
![]() |
4a673eee81 | ||
![]() |
cebf349f9a | ||
![]() |
3683deb51c | ||
![]() |
99ee076db9 | ||
![]() |
04f759041f | ||
![]() |
75f89059e7 | ||
![]() |
a81f31156d | ||
![]() |
f706452e67 | ||
![]() |
b0126afbcf | ||
![]() |
5b8393ff89 | ||
![]() |
d2235da06a | ||
![]() |
a87f6a0791 | ||
![]() |
7e7cfb79a4 | ||
![]() |
fb43a5265c | ||
![]() |
439a814133 | ||
![]() |
d9dfcc04bf | ||
![]() |
0cfac137b7 | ||
![]() |
4575ee805a | ||
![]() |
67f70ce2cc | ||
![]() |
2f641ffb13 | ||
![]() |
50f92269c2 | ||
![]() |
f220f397ae | ||
![]() |
cdb4096124 | ||
![]() |
01938af65b | ||
![]() |
47a1fca32f | ||
![]() |
321342cf6d | ||
![]() |
086e9beb59 | ||
![]() |
3519d4b219 | ||
![]() |
9034b9a9ae | ||
![]() |
90ba8440a0 | ||
![]() |
4988b37d6f | ||
![]() |
ad4799ee60 | ||
![]() |
35229f8ae5 | ||
![]() |
7a011d9e75 | ||
![]() |
3d86835979 | ||
![]() |
4073306538 | ||
![]() |
b86aa28d6a | ||
![]() |
d43cee29f2 | ||
![]() |
acad468b4a | ||
![]() |
4cbe842cfa | ||
![]() |
d93e227190 | ||
![]() |
a9cf424998 | ||
![]() |
6d8fdf46d5 | ||
![]() |
781f98ef91 | ||
![]() |
1313f685da | ||
![]() |
4779a993d3 | ||
![]() |
342b2ae5dc | ||
![]() |
ce8ae40206 | ||
![]() |
d0704f621f | ||
![]() |
c6da4043ed | ||
![]() |
1aa3761d1a | ||
![]() |
ff769caf82 | ||
![]() |
be6bc68b56 | ||
![]() |
feb3d11f63 | ||
![]() |
d2f9b063b2 | ||
![]() |
315089c361 | ||
![]() |
e95df0dbd5 | ||
![]() |
8fed029ee3 | ||
![]() |
522daf5aff | ||
![]() |
e948eebe84 | ||
![]() |
783d4e7e8a | ||
![]() |
1ce2198621 | ||
![]() |
f521def4a5 | ||
![]() |
75202921a1 | ||
![]() |
4ef8b93344 | ||
![]() |
881b191b8d | ||
![]() |
b39e071d1e | ||
![]() |
84cb3a1060 | ||
![]() |
f4ea3980c2 | ||
![]() |
ef73720a5e | ||
![]() |
d8cdc57702 | ||
![]() |
b52dee37f4 | ||
![]() |
21bd9f09da | ||
![]() |
44f24e58f6 | ||
![]() |
860c4d045a | ||
![]() |
3b0c96f654 | ||
![]() |
65b744472b | ||
![]() |
26489b0f00 | ||
![]() |
414abad05f | ||
![]() |
735d9a5391 | ||
![]() |
50571449cb | ||
![]() |
a31aacd115 | ||
![]() |
f5b57cc0da | ||
![]() |
b7006a8f2c | ||
![]() |
82bb467a2a | ||
![]() |
3a44e92432 | ||
![]() |
e60db5f928 | ||
![]() |
78485287a4 | ||
![]() |
48b6f01b13 | ||
![]() |
39e04de208 | ||
![]() |
68d5b59693 | ||
![]() |
4ef01ef745 | ||
![]() |
573fa8870c | ||
![]() |
88d354b08b | ||
![]() |
0ff65b5496 | ||
![]() |
14e0dcb085 | ||
![]() |
e008fd21a4 | ||
![]() |
4638149ad0 | ||
![]() |
e386bdd6b3 | ||
![]() |
decb167ba9 | ||
![]() |
dd9557c13e | ||
![]() |
708d7162fb | ||
![]() |
1ee1b522f1 | ||
![]() |
d5a500c037 | ||
![]() |
3e02c65bc0 | ||
![]() |
d10f9a5f25 | ||
![]() |
17e7214d25 | ||
![]() |
22774592db | ||
![]() |
7c2aa6e69d | ||
![]() |
d1dbcda88e | ||
![]() |
3e05508cf9 | ||
![]() |
1acdefd358 | ||
![]() |
23143797f9 | ||
![]() |
3364bf268b | ||
![]() |
2025d6305e | ||
![]() |
639ad7698d | ||
![]() |
4eaff51ba2 | ||
![]() |
1fb30bc3d9 | ||
![]() |
6b66f40bcb | ||
![]() |
a3cd531cc8 | ||
![]() |
55c84192be | ||
![]() |
aa9018b97b | ||
![]() |
1e79c146a7 | ||
![]() |
cb8545e33d | ||
![]() |
4a484c535b | ||
![]() |
ee417e41ea | ||
![]() |
3cdc1fcaee | ||
![]() |
0a023a61f9 | ||
![]() |
73f81c5b52 | ||
![]() |
bc4acbb7e1 | ||
![]() |
26d07ea2c6 | ||
![]() |
5380c8352d | ||
![]() |
e85e91183e | ||
![]() |
b48c251b36 | ||
![]() |
181a14ce59 | ||
![]() |
a208a22bc2 | ||
![]() |
b9ea7ce066 | ||
![]() |
f2f275512d | ||
![]() |
5150c2ee62 | ||
![]() |
644766b5a6 | ||
![]() |
ca679f5932 | ||
![]() |
7f7145e8de | ||
![]() |
aa1878c15a | ||
![]() |
e7d23176b7 | ||
![]() |
31218c2a8c | ||
![]() |
06374c82fd | ||
![]() |
8efcc8f80f | ||
![]() |
2d6317bd24 | ||
![]() |
157b064214 | ||
![]() |
0ece4851d2 | ||
![]() |
f1f5996975 | ||
![]() |
0a2dbc4688 | ||
![]() |
13587d7ab3 | ||
![]() |
0fcef064fb | ||
![]() |
19b8796cbc | ||
![]() |
15fb60a845 | ||
![]() |
5c202f04e7 | ||
![]() |
bc6fdf81d2 | ||
![]() |
3194a2bf2c | ||
![]() |
72d1e5131f | ||
![]() |
7721098551 | ||
![]() |
0b7593ad28 | ||
![]() |
a68823491c | ||
![]() |
f563bc4210 | ||
![]() |
43e7be9b86 | ||
![]() |
27131d15dd | ||
![]() |
fb1a290bd9 | ||
![]() |
ef16145695 | ||
![]() |
4fbd1182c2 | ||
![]() |
2d39e65b5c | ||
![]() |
8e96b675fa | ||
![]() |
adb6943420 | ||
![]() |
eae7babf93 | ||
![]() |
7d5e18c05b | ||
![]() |
cbe001efd6 | ||
![]() |
86b783fb0f | ||
![]() |
ccc27b48df | ||
![]() |
a32391f560 | ||
![]() |
aed0348802 | ||
![]() |
1b66446c0d | ||
![]() |
2bc0c8a483 | ||
![]() |
3f7e02e305 | ||
![]() |
dd0d666003 | ||
![]() |
81859a37de | ||
![]() |
180bb581a3 | ||
![]() |
2f31779af4 | ||
![]() |
ee6d512165 | ||
![]() |
1470fdc057 | ||
![]() |
93bbaf187e | ||
![]() |
f1e43007f1 | ||
![]() |
155436b85d | ||
![]() |
f3e029c3f6 | ||
![]() |
90d6416f55 | ||
![]() |
af2a2e45af | ||
![]() |
e79eda9c5c | ||
![]() |
b338d9dbcf | ||
![]() |
7fb9345344 | ||
![]() |
77b488568b | ||
![]() |
fcf650c6eb | ||
![]() |
0c21023ad8 | ||
![]() |
8f35a56ec8 | ||
![]() |
95ba1873e4 | ||
![]() |
8b8652d44c | ||
![]() |
2515b8167f | ||
![]() |
09dd044f3d | ||
![]() |
ace0ed9667 | ||
![]() |
cf03708da2 | ||
![]() |
d4670bf6fa | ||
![]() |
feea448a24 | ||
![]() |
71ad54652b | ||
![]() |
8e1deda7b0 | ||
![]() |
752f985e13 | ||
![]() |
89e3219e06 | ||
![]() |
429dddc6c9 | ||
![]() |
981174a490 | ||
![]() |
201f7e9848 | ||
![]() |
bb0d8ad58a | ||
![]() |
29e64f7c1a | ||
![]() |
4819ebd56e | ||
![]() |
3b603b0637 | ||
![]() |
baa63249d1 | ||
![]() |
ee347e3081 | ||
![]() |
f96bc95053 | ||
![]() |
e1df4757e4 | ||
![]() |
4fc37a7321 | ||
![]() |
2a45a13f73 | ||
![]() |
067b15c300 | ||
![]() |
8a1c283542 | ||
![]() |
93d1e8b2ff | ||
![]() |
c60d5b54fa | ||
![]() |
ef180f082e | ||
![]() |
f52741cc37 | ||
![]() |
2a2661f066 | ||
![]() |
b521903138 | ||
![]() |
acbd699d95 | ||
![]() |
6b8928becb | ||
![]() |
e393bdb1e5 | ||
![]() |
bba6b96765 | ||
![]() |
740116356c | ||
![]() |
2f6e4fa4a3 | ||
![]() |
fb3f6721b2 | ||
![]() |
4e7bd21e5c | ||
![]() |
219c2030b9 | ||
![]() |
b75fdb4566 | ||
![]() |
4584b14a31 | ||
![]() |
814ddb5932 | ||
![]() |
6ea0f6290a | ||
![]() |
c796fe1fe6 | ||
![]() |
a452a164e6 | ||
![]() |
0d9dd69b19 | ||
![]() |
d7b73c18f1 | ||
![]() |
07f66c0e45 | ||
![]() |
d449acbf86 | ||
![]() |
fce416ba76 | ||
![]() |
cb6bfe8556 | ||
![]() |
d7b31e1d25 | ||
![]() |
85057376d6 | ||
![]() |
c43ac7c869 | ||
![]() |
b2657315f1 | ||
![]() |
de5ed9717c | ||
![]() |
e17a6cbb9f | ||
![]() |
8e783b774b | ||
![]() |
733663f40d | ||
![]() |
4b2a792a62 | ||
![]() |
f7aa171d01 | ||
![]() |
5eafefb683 | ||
![]() |
5d1b02a856 | ||
![]() |
4acda3d9ae | ||
![]() |
643e10ace2 | ||
![]() |
7b64a232de | ||
![]() |
d7472d837d | ||
![]() |
94b473ab4b | ||
![]() |
4a05bbb6c8 | ||
![]() |
0343659b35 | ||
![]() |
f38eadbe30 | ||
![]() |
eb29a53ac5 | ||
![]() |
bc71e260e2 | ||
![]() |
ddf23a3443 | ||
![]() |
d41b248d1c | ||
![]() |
a025b25933 | ||
![]() |
c9a52a6088 | ||
![]() |
0276dca406 | ||
![]() |
3bb95ad44c | ||
![]() |
0a6572c282 | ||
![]() |
3937067be1 | ||
![]() |
48e4eb44f2 | ||
![]() |
c78cc6f2fd | ||
![]() |
73a71e0f5c | ||
![]() |
93605774f0 | ||
![]() |
2834e5d78f | ||
![]() |
dd467b4d63 | ||
![]() |
1fa541776b | ||
![]() |
f6f67c7b0a | ||
![]() |
9b3f19c19b | ||
![]() |
f4a9ec15e8 | ||
![]() |
006c4ecb02 | ||
![]() |
1c752b0e18 | ||
![]() |
f84aff63e3 | ||
![]() |
ae8121b680 | ||
![]() |
882fbf9275 | ||
![]() |
0a1743251e | ||
![]() |
3403a127c1 | ||
![]() |
9c5ca9f09d | ||
![]() |
73eea5608a | ||
![]() |
f48aeb91f4 | ||
![]() |
0bda964ece | ||
![]() |
14f5d54b50 | ||
![]() |
105ac2f6ff | ||
![]() |
160560f1fd | ||
![]() |
deeb667d6f | ||
![]() |
78123ff6f5 | ||
![]() |
9b1fdff22f | ||
![]() |
0275502796 | ||
![]() |
8af475e319 | ||
![]() |
2202c8f09e | ||
![]() |
adf309d3a8 | ||
![]() |
3071314586 | ||
![]() |
88e1df840d | ||
![]() |
23c1b66f6c | ||
![]() |
b0318a1cce | ||
![]() |
c130a66e4d | ||
![]() |
3386ba6d1b | ||
![]() |
9275569fa6 | ||
![]() |
2b23dfd0a6 | ||
![]() |
2a13d9990e | ||
![]() |
c9669b51c6 | ||
![]() |
486c180b3c | ||
![]() |
9eb5bf9b87 | ||
![]() |
953a89f3a1 | ||
![]() |
d638fa1434 | ||
![]() |
e6d700288c | ||
![]() |
371f14cdc9 | ||
![]() |
0733ae2404 | ||
![]() |
b1731ebd49 | ||
![]() |
342b3191ac | ||
![]() |
cd39445245 | ||
![]() |
92eac67367 | ||
![]() |
0e31a0c704 | ||
![]() |
d60c117a70 | ||
![]() |
69ccad5998 | ||
![]() |
b6d22320e6 | ||
![]() |
d3bf948dba | ||
![]() |
5de3d96b31 | ||
![]() |
d30dd64322 | ||
![]() |
386df10a5a | ||
![]() |
af147de547 | ||
![]() |
23cd0e5a5e | ||
![]() |
c5a566657c | ||
![]() |
ce2018c864 | ||
![]() |
472ab46af2 | ||
![]() |
7f87d45bb5 | ||
![]() |
e9f7ab18bb | ||
![]() |
fba83a8afe | ||
![]() |
05089abddc | ||
![]() |
ccd70aac51 | ||
![]() |
5df8445d04 | ||
![]() |
8c43674fa4 | ||
![]() |
f162316a6b | ||
![]() |
670596ed88 | ||
![]() |
6b3eb716c4 | ||
![]() |
6a5180d94c | ||
![]() |
83faaedfcc | ||
![]() |
d98d790a7a | ||
![]() |
36b5833a3a | ||
![]() |
5e86781a79 | ||
![]() |
6a780504b4 | ||
![]() |
a0d8212136 | ||
![]() |
0e1e6a9d62 | ||
![]() |
812282a332 | ||
![]() |
a8a4c9e97f | ||
![]() |
24c293e335 | ||
![]() |
0a596df497 | ||
![]() |
3d66c6572b | ||
![]() |
f45769cbb2 | ||
![]() |
ef51f93c6f | ||
![]() |
35af68f148 | ||
![]() |
ff21430b43 | ||
![]() |
fcb67f5119 | ||
![]() |
0a41fbd185 | ||
![]() |
d32aaf488f | ||
![]() |
1254798013 | ||
![]() |
c72d2a2308 | ||
![]() |
703181655b | ||
![]() |
da4a1c5bf0 | ||
![]() |
1130bd502e | ||
![]() |
27ea4ee679 | ||
![]() |
56e3b66d06 | ||
![]() |
7d4768e151 | ||
![]() |
7ec1011610 | ||
![]() |
e1bbd2055c | ||
![]() |
8a19547d9f | ||
![]() |
6e6922dab8 | ||
![]() |
e009ade922 | ||
![]() |
90e15bcab9 | ||
![]() |
2a040cea4b | ||
![]() |
72f2a7f8db | ||
![]() |
8a8022afe6 | ||
![]() |
b692bec310 | ||
![]() |
536c01c70d | ||
![]() |
ec8e14e977 | ||
![]() |
85b34f8809 | ||
![]() |
22951a56a5 | ||
![]() |
46ad84b101 | ||
![]() |
5efb77e520 | ||
![]() |
76903102b8 | ||
![]() |
c8e26b429c | ||
![]() |
55c1310f74 | ||
![]() |
b8278d91e0 | ||
![]() |
b032502148 | ||
![]() |
bec1a4dd1a | ||
![]() |
4dfb9e7977 | ||
![]() |
2bfa165cdc | ||
![]() |
658666276d | ||
![]() |
62f91b9084 | ||
![]() |
719140ab78 | ||
![]() |
0471fd8145 | ||
![]() |
a079a0c901 | ||
![]() |
ac2fa74c8f | ||
![]() |
4c10ef65f5 | ||
![]() |
cfa697fab2 | ||
![]() |
a09b9d3e4d | ||
![]() |
c470909f19 | ||
![]() |
5e59cfcf9d | ||
![]() |
a099fe35d2 | ||
![]() |
bcfd8a2450 | ||
![]() |
8ed9d71e14 | ||
![]() |
004c2fa55a | ||
![]() |
3dd63d03cb | ||
![]() |
cceedab864 | ||
![]() |
b494b2ea39 | ||
![]() |
0b29cf086b | ||
![]() |
11d33097f7 | ||
![]() |
3ae61645de | ||
![]() |
4711befffa | ||
![]() |
5673d53a20 | ||
![]() |
90ca4a5e92 | ||
![]() |
ad252956ab | ||
![]() |
1b2c091c39 | ||
![]() |
9031bc0c7b | ||
![]() |
1d85e0ea63 | ||
![]() |
458774aadb | ||
![]() |
ae89f7bea3 | ||
![]() |
fd77b8552b | ||
![]() |
bae9f5e844 | ||
![]() |
e3f3d90b68 | ||
![]() |
646fa877ba | ||
![]() |
7f3bd8aec2 | ||
![]() |
4501203a7a | ||
![]() |
06292bceb2 | ||
![]() |
f94f14ab65 | ||
![]() |
7145c68e03 | ||
![]() |
d1b0cd74be | ||
![]() |
bac3825c87 | ||
![]() |
fc1d283414 | ||
![]() |
c0652daa97 | ||
![]() |
553903bd9d | ||
![]() |
a43ec25b7e | ||
![]() |
bb2a66fd02 | ||
![]() |
71ac830bfa | ||
![]() |
82bce80c62 | ||
![]() |
67ddf78e18 | ||
![]() |
8285df0f3f | ||
![]() |
bdb45295b9 | ||
![]() |
f330ee8f8d | ||
![]() |
7331e4a7f2 | ||
![]() |
51252d3b61 | ||
![]() |
dcdb2c323e | ||
![]() |
c4ac901c67 | ||
![]() |
a7ce072ca2 | ||
![]() |
a9b427b877 | ||
![]() |
67a9f3a4ad | ||
![]() |
1a4905f36a | ||
![]() |
cbb1fde7b0 | ||
![]() |
b86bd019a7 | ||
![]() |
6a0bada9d2 | ||
![]() |
a708278cf0 | ||
![]() |
119462cbc9 | ||
![]() |
0324a4928c | ||
![]() |
895a2a56b5 | ||
![]() |
d9e616beee | ||
![]() |
aa5d5d2b6d | ||
![]() |
85dc555358 | ||
![]() |
15b4a7d055 | ||
![]() |
696c94050d | ||
![]() |
b222614c4a | ||
![]() |
edff694bf3 | ||
![]() |
be430a6ac0 | ||
![]() |
937d40c5f7 | ||
![]() |
d3979676ab | ||
![]() |
6716262a28 | ||
![]() |
06d8bafce6 | ||
![]() |
f814755908 | ||
![]() |
f355fd2551 | ||
![]() |
ea84c62d76 | ||
![]() |
acda71cebb | ||
![]() |
67dcd2e5c6 | ||
![]() |
c996644613 | ||
![]() |
171c3e492d | ||
![]() |
8834195cc6 | ||
![]() |
ed57e72fa1 | ||
![]() |
7e84c3e167 | ||
![]() |
4adc33471b | ||
![]() |
31d07cc1e2 | ||
![]() |
a349a66d5a | ||
![]() |
7d427b4cc4 | ||
![]() |
6c7e54868d | ||
![]() |
9484a5e2ee | ||
![]() |
3cbd2057e3 | ||
![]() |
71ff1cf713 | ||
![]() |
c737d891bc | ||
![]() |
82a53343fc | ||
![]() |
03fdc60018 | ||
![]() |
42d19d98ad | ||
![]() |
c9915bba18 | ||
![]() |
a275d7ff50 | ||
![]() |
74199c8624 | ||
![]() |
238bff1fee | ||
![]() |
de534b58c5 | ||
![]() |
111a0f9f17 | ||
![]() |
50392ed67d | ||
![]() |
3de9da0528 | ||
![]() |
ece93cadd5 | ||
![]() |
7219c8d33c | ||
![]() |
b0a09c7876 | ||
![]() |
1d017d3cbc | ||
![]() |
5fa56f2aca | ||
![]() |
5ded1b139f | ||
![]() |
2abb0db272 | ||
![]() |
674c041c13 | ||
![]() |
03c89a69a2 | ||
![]() |
dbed5e2a62 | ||
![]() |
d7519903a1 | ||
![]() |
ab14f0d7ac | ||
![]() |
3b6e43b7ca | ||
![]() |
7d3b7af874 | ||
![]() |
2acc348062 | ||
![]() |
33ba8acd05 | ||
![]() |
0c56af7090 | ||
![]() |
4375ecaad7 | ||
![]() |
90c538d4b6 | ||
![]() |
1ffa8329d0 | ||
![]() |
b404b7974a | ||
![]() |
de44b580f9 | ||
![]() |
2a630cd745 | ||
![]() |
1ccccc5e39 | ||
![]() |
aec851acfa | ||
![]() |
ad5ac479fd | ||
![]() |
67b82a404c | ||
![]() |
f7f86a2f62 | ||
![]() |
6e42b4af27 | ||
![]() |
fe9ed8af76 | ||
![]() |
c4c3f369c0 | ||
![]() |
9b9bf40e47 | ||
![]() |
14a888a610 | ||
![]() |
f3d777c65c | ||
![]() |
d494b6c934 | ||
![]() |
7294220727 | ||
![]() |
665b9087b1 | ||
![]() |
f1691050cd | ||
![]() |
169b6acd24 | ||
![]() |
35b3bf2edb | ||
![]() |
8f73c8c98b | ||
![]() |
94ea8c21eb | ||
![]() |
b6a19c3e2d | ||
![]() |
21455d58a6 | ||
![]() |
239e9bd3db | ||
![]() |
0832171a2b | ||
![]() |
1edfcc629c | ||
![]() |
9a2a8698ef | ||
![]() |
54c31422d9 | ||
![]() |
a33464284c | ||
![]() |
4842caf426 | ||
![]() |
02b6b4d8eb | ||
![]() |
4b0d7c7d88 | ||
![]() |
559b53acc3 | ||
![]() |
4233c18dbb | ||
![]() |
adec2c9fcc | ||
![]() |
6ad2406262 | ||
![]() |
bfeb8ca104 | ||
![]() |
5614edfa2f | ||
![]() |
946f7b2305 | ||
![]() |
dfcf435f88 | ||
![]() |
0e734c267c | ||
![]() |
faadcec4d1 | ||
![]() |
eb81784818 | ||
![]() |
327010f76b | ||
![]() |
371669dcb6 | ||
![]() |
fb702b93ca | ||
![]() |
50c8453785 | ||
![]() |
14fb5ee6c4 | ||
![]() |
46c2343ec6 | ||
![]() |
f5c226362f | ||
![]() |
9114c1157d | ||
![]() |
a4f4230275 | ||
![]() |
46a6147c08 | ||
![]() |
0d26923d79 | ||
![]() |
b57c93cf03 | ||
![]() |
ec19e4bc8f | ||
![]() |
cb68a9c2ce | ||
![]() |
b51ded1580 | ||
![]() |
4b6fb5bfeb | ||
![]() |
9b8175b5be | ||
![]() |
3ecfc622e2 | ||
![]() |
d8d2ee4e09 | ||
![]() |
be478cb088 | ||
![]() |
c187b4487f | ||
![]() |
f6d21e74cb | ||
![]() |
bde4c4bd25 | ||
![]() |
d9aaceea95 | ||
![]() |
676d64a24a | ||
![]() |
8ae1768f71 | ||
![]() |
212705e7e3 | ||
![]() |
b3f6524e5c | ||
![]() |
5ca0a0adf2 | ||
![]() |
669d2c44c9 | ||
![]() |
604bc5b4c1 | ||
![]() |
88268ae569 | ||
![]() |
140fb86401 | ||
![]() |
2b281c4357 | ||
![]() |
7b6dbfb456 | ||
![]() |
b3c49ac86b | ||
![]() |
d309fd9c97 | ||
![]() |
f3a280dcb6 | ||
![]() |
43894687a2 | ||
![]() |
8dd8928dab | ||
![]() |
282a4d15c2 | ||
![]() |
83a2ffc67e | ||
![]() |
e9a6e3fae0 | ||
![]() |
97944b9793 | ||
![]() |
0b5d995b6d | ||
![]() |
1781a9fe9a | ||
![]() |
a0479bf7ca | ||
![]() |
2affa31edf | ||
![]() |
0bd040a851 | ||
![]() |
616c6a1607 | ||
![]() |
a5176fbf80 | ||
![]() |
f2b76b7582 | ||
![]() |
f4847f31ae | ||
![]() |
05adcf2c12 | ||
![]() |
ea301be3c1 | ||
![]() |
88e9785b01 | ||
![]() |
78efabfc1c | ||
![]() |
9d3e22200c | ||
![]() |
183f9701fd | ||
![]() |
ebbba134fe | ||
![]() |
c257be8176 | ||
![]() |
afb0aea660 | ||
![]() |
960bf46f44 | ||
![]() |
16db799e88 | ||
![]() |
f8f2cdcfcc | ||
![]() |
a1f7862f96 | ||
![]() |
3ff9284f2a | ||
![]() |
edf8f27c0f | ||
![]() |
a720953ff3 | ||
![]() |
f79dd26a82 | ||
![]() |
36b5fce4dd | ||
![]() |
89537322fd | ||
![]() |
2229ce1fe9 | ||
![]() |
f257b2177a | ||
![]() |
056c1fd43e | ||
![]() |
acacd3134f | ||
![]() |
1fe0ba1a6e | ||
![]() |
e639f4b5de | ||
![]() |
5a234bd989 | ||
![]() |
661227266e | ||
![]() |
e01556fd9a | ||
![]() |
5cb53ffc18 | ||
![]() |
e7178626ab | ||
![]() |
7f0948b0ed | ||
![]() |
4baee67781 | ||
![]() |
7061f38abe | ||
![]() |
2aa259c0b2 | ||
![]() |
a0f74e715a | ||
![]() |
c13e761c3f | ||
![]() |
2837e44bab | ||
![]() |
d41e3bb41e | ||
![]() |
4160bbb8c4 | ||
![]() |
404a20f280 | ||
![]() |
2241146b9f | ||
![]() |
bcb26c5721 | ||
![]() |
a681d8c1ba | ||
![]() |
0515b74f75 | ||
![]() |
7eeb96d88e | ||
![]() |
5b6c73ef06 | ||
![]() |
c70b866d16 | ||
![]() |
b84f2874dc | ||
![]() |
c372b5529b | ||
![]() |
a43156c38d | ||
![]() |
a15112febc | ||
![]() |
1c6a677a39 | ||
![]() |
9bf749a2c8 | ||
![]() |
f6c9d9df20 | ||
![]() |
5386e0ded9 | ||
![]() |
8fab405a3a | ||
![]() |
ee409f3ca9 | ||
![]() |
bda9beacaa | ||
![]() |
5d8c7e5733 | ||
![]() |
a68c763125 | ||
![]() |
31ac89d9d6 | ||
![]() |
8b258cbbe4 | ||
![]() |
53676fc0fd | ||
![]() |
42c561af9e | ||
![]() |
fae777c14c | ||
![]() |
1af6dc614a | ||
![]() |
2986004638 | ||
![]() |
d6f7b4706b | ||
![]() |
b40dd3e5c0 | ||
![]() |
2f4097ca9d | ||
![]() |
c8a91fbb25 | ||
![]() |
0ec259a5fc | ||
![]() |
2fda99bdb7 | ||
![]() |
1bb4ac4e9c | ||
![]() |
f376b98c09 | ||
![]() |
7382fdb2d2 | ||
![]() |
aead9592cf | ||
![]() |
bedacf29d9 | ||
![]() |
570e9a8307 | ||
![]() |
fcb94ec603 | ||
![]() |
69886ed58b | ||
![]() |
798235cd21 | ||
![]() |
b38b6b6f35 | ||
![]() |
2dba13c52e | ||
![]() |
ff366cb2c5 | ||
![]() |
a87861a993 | ||
![]() |
65476356c9 | ||
![]() |
8af6667f3e | ||
![]() |
b546df7b95 | ||
![]() |
20c1f12da8 | ||
![]() |
e65ff201af | ||
![]() |
4f367a3dcd | ||
![]() |
d7093bce4d | ||
![]() |
79e3e59cae | ||
![]() |
f1b292df93 | ||
![]() |
0cd383b8dd | ||
![]() |
22c404a667 | ||
![]() |
ba11a59d89 | ||
![]() |
06020851a9 | ||
![]() |
fd5cbde18c | ||
![]() |
384398a1e2 | ||
![]() |
2bdba4ba8b | ||
![]() |
db4179a530 | ||
![]() |
b905b74dc2 | ||
![]() |
ff05c36856 | ||
![]() |
40ea5eb53d | ||
![]() |
02f48ccc7f | ||
![]() |
72eaff148c | ||
![]() |
8b60397f06 | ||
![]() |
18d019c62a | ||
![]() |
27527b18e1 | ||
![]() |
ae9aa2662a | ||
![]() |
3bfb593b21 | ||
![]() |
8556e99241 | ||
![]() |
e885822a34 | ||
![]() |
8ebb564a79 | ||
![]() |
7dc176edcb | ||
![]() |
5167fe078b | ||
![]() |
bc7188c8a8 | ||
![]() |
5a05cb96be | ||
![]() |
0258726f0a | ||
![]() |
2fa9aa04f4 | ||
![]() |
a5f9927459 | ||
![]() |
61b422502b | ||
![]() |
1e57b5ea49 | ||
![]() |
12ce915e8e | ||
![]() |
a32273af91 | ||
![]() |
96a327af17 | ||
![]() |
1910e81ad9 | ||
![]() |
80593e774c | ||
![]() |
c092fc8e18 | ||
![]() |
579efa15c7 | ||
![]() |
37ff4e9aeb | ||
![]() |
4e4a7de5d4 | ||
![]() |
2d1bc6436a | ||
![]() |
65726d75cc | ||
![]() |
d63c0a32eb | ||
![]() |
e49c4162e5 | ||
![]() |
ffc5ad5ce7 | ||
![]() |
2dbfc28d69 | ||
![]() |
1ac7b2b8cb | ||
![]() |
7d047e612e | ||
![]() |
24f2999669 | ||
![]() |
b08728b645 | ||
![]() |
00dee43a1e | ||
![]() |
21e300b9f3 | ||
![]() |
158f0aa2d9 | ||
![]() |
10fb763d66 | ||
![]() |
4aa2c1c2c2 | ||
![]() |
bdf044d264 | ||
![]() |
6049a1f2f5 | ||
![]() |
a9fea9f606 | ||
![]() |
11002e9d45 | ||
![]() |
e7a0b850df | ||
![]() |
736c902f3c | ||
![]() |
a67ff564d0 | ||
![]() |
2a778383b1 | ||
![]() |
36457400e7 | ||
![]() |
1d629e7b2e | ||
![]() |
5f764ab8f5 | ||
![]() |
a8c9edbc3f | ||
![]() |
0a5bffe826 | ||
![]() |
9c9b6bc0d6 | ||
![]() |
562f7e7e41 | ||
![]() |
594c55afa6 | ||
![]() |
0abf97e999 | ||
![]() |
b811aec773 | ||
![]() |
ca47f566dc | ||
![]() |
65674f7fd4 | ||
![]() |
dcc510ff6c | ||
![]() |
a4fe43a964 | ||
![]() |
3dab4c07cf | ||
![]() |
ee3248ea5d | ||
![]() |
7be5ec0521 | ||
![]() |
04e90cc279 | ||
![]() |
ec8d488249 | ||
![]() |
41fdafac45 | ||
![]() |
d2e2622279 | ||
![]() |
9476bd6527 | ||
![]() |
24a06ea6f6 | ||
![]() |
2567f8eefb | ||
![]() |
fa5f5ce251 | ||
![]() |
728a61756a | ||
![]() |
736ccbe376 | ||
![]() |
fa2b226b9e | ||
![]() |
e8c5ae194d | ||
![]() |
cc2feab37e | ||
![]() |
83b084a90b | ||
![]() |
e2ac0722c8 | ||
![]() |
c3efb40b8e | ||
![]() |
03d7a416f3 | ||
![]() |
e6e812fdb0 | ||
![]() |
b34160eeec | ||
![]() |
d01aeab242 | ||
![]() |
9904e01252 | ||
![]() |
7f068b691b | ||
![]() |
59558efed1 | ||
![]() |
a88e19a8ed | ||
![]() |
0c17f0825b | ||
![]() |
9384d2523a | ||
![]() |
0e13172a89 | ||
![]() |
92f34452b5 | ||
![]() |
db54929584 | ||
![]() |
ba23cafb18 | ||
![]() |
a2e189767b | ||
![]() |
0d236fd678 | ||
![]() |
9979b160c7 | ||
![]() |
65b332c395 | ||
![]() |
b867ac8cc7 | ||
![]() |
9a0ff24ffe | ||
![]() |
9540a12b6f | ||
![]() |
fdfb53c05c | ||
![]() |
3ec979cc40 | ||
![]() |
9ea08c8a4b | ||
![]() |
629eada5c3 | ||
![]() |
a1220c77da | ||
![]() |
b4668367c6 | ||
![]() |
77da40e507 | ||
![]() |
b3b2748bb7 | ||
![]() |
26e8143616 | ||
![]() |
1444fe5468 | ||
![]() |
ac431e3ece | ||
![]() |
563a4137bd | ||
![]() |
19cbcd0c1d | ||
![]() |
8803b60b28 | ||
![]() |
e9f59ae769 | ||
![]() |
5cf3bee336 | ||
![]() |
060fe835c7 | ||
![]() |
2688ea8f59 | ||
![]() |
8eb61cf752 | ||
![]() |
6628901d46 | ||
![]() |
5a31882be3 | ||
![]() |
a42da09d6c | ||
![]() |
658cf5c873 | ||
![]() |
b8c752b740 | ||
![]() |
9151ae7081 | ||
![]() |
a1a894f722 | ||
![]() |
3352ee3151 | ||
![]() |
da3533a430 | ||
![]() |
0bb7f9becf | ||
![]() |
40c64ee2d8 | ||
![]() |
66651f7111 | ||
![]() |
c7d0bd5dec | ||
![]() |
9ce0a9d49d | ||
![]() |
2070b353c2 | ||
![]() |
1d91f3b91b | ||
![]() |
8b0aebfddb | ||
![]() |
467905d7b0 | ||
![]() |
cc81921bcb | ||
![]() |
8600c04ff3 | ||
![]() |
3f31445f12 | ||
![]() |
8a33371f37 | ||
![]() |
1164bd7183 | ||
![]() |
589fcd09c0 | ||
![]() |
c5d49016d4 | ||
![]() |
8886b12151 | ||
![]() |
336ffd7cf0 | ||
![]() |
3088778a9f | ||
![]() |
4c1de83b24 | ||
![]() |
ee2fbfc2d1 | ||
![]() |
dff7fe722b | ||
![]() |
eb6dac2e9f | ||
![]() |
255760de16 | ||
![]() |
a2373b817a | ||
![]() |
72a9940863 | ||
![]() |
46e088b5f3 | ||
![]() |
a3468b51e2 | ||
![]() |
34f19c4268 | ||
![]() |
1d2c616ce0 | ||
![]() |
99e0f0c3e4 | ||
![]() |
7d4c45c4c0 | ||
![]() |
1a92dfb019 | ||
![]() |
cc7f27fb53 | ||
![]() |
e8402008bc | ||
![]() |
c1a302834c | ||
![]() |
762f374f93 | ||
![]() |
e21d2bd511 | ||
![]() |
d936ca6b89 | ||
![]() |
88ac821070 | ||
![]() |
c20837d5f5 | ||
![]() |
81a4c66f92 | ||
![]() |
e4dfb02cb0 | ||
![]() |
0abaab4880 | ||
![]() |
a1aaa52c2a | ||
![]() |
b3a509ad14 | ||
![]() |
ad0f58090f | ||
![]() |
43c4e619c2 | ||
![]() |
427397ba7b | ||
![]() |
b51abf1ea6 | ||
![]() |
76e082159d | ||
![]() |
d36c371c1d | ||
![]() |
a5b2100f8a | ||
![]() |
fe19780f06 | ||
![]() |
83f1d7af82 | ||
![]() |
1916616b07 | ||
![]() |
0a6a684acc | ||
![]() |
6d9aecd500 | ||
![]() |
4d25db2e11 | ||
![]() |
77d5714059 | ||
![]() |
76c59cbdea | ||
![]() |
212f7dfc93 | ||
![]() |
9ba37ce34c | ||
![]() |
6c439bfbc4 | ||
![]() |
352d0db08b | ||
![]() |
be8ce1fce5 | ||
![]() |
f6356e576a | ||
![]() |
83a34a8ba1 | ||
![]() |
fb7a855eda | ||
![]() |
9c1d778623 | ||
![]() |
1bad2a023d | ||
![]() |
999da51e99 | ||
![]() |
ea4b965eeb | ||
![]() |
33160e83cb | ||
![]() |
3e5e7f49cc | ||
![]() |
cc02b01c2b | ||
![]() |
243e5391db | ||
![]() |
230ad5c04f | ||
![]() |
289cfaa407 | ||
![]() |
0798745c16 | ||
![]() |
094695a7ff | ||
![]() |
86f041b803 | ||
![]() |
00e65153f4 | ||
![]() |
b12f0490f3 | ||
![]() |
42a2bc8a9a | ||
![]() |
8adca3725d | ||
![]() |
b57d4b3048 | ||
![]() |
9c7aa241e4 | ||
![]() |
c3ec9b2ad7 | ||
![]() |
195070f8f5 | ||
![]() |
cbfe91f36f | ||
![]() |
738e2ac344 | ||
![]() |
ba0be665ae | ||
![]() |
0ba6f8b39f | ||
![]() |
2773f5fbc8 | ||
![]() |
263a816c3b | ||
![]() |
e7d148336b | ||
![]() |
829059ea01 | ||
![]() |
622d698ff8 | ||
![]() |
f09b04dce0 | ||
![]() |
59f8583895 | ||
![]() |
f506fc0478 | ||
![]() |
880676d670 | ||
![]() |
6485327b97 | ||
![]() |
5773152ed3 | ||
![]() |
e88312659b | ||
![]() |
c4d0ba549f | ||
![]() |
cb41afb11f | ||
![]() |
6d27aea9f2 | ||
![]() |
39e1f9cb76 | ||
![]() |
8fb7d64f79 | ||
![]() |
08fdef4870 | ||
![]() |
aa0196b9d0 | ||
![]() |
a3426f92ac | ||
![]() |
d50d4254c5 | ||
![]() |
50cdadc4a2 | ||
![]() |
5aa9b6cb12 | ||
![]() |
44fc8d80e0 | ||
![]() |
817fa57bfe | ||
![]() |
668e2da01b | ||
![]() |
7f3982d153 | ||
![]() |
f62ae930c7 | ||
![]() |
d0808ce159 | ||
![]() |
7b19dadbf5 | ||
![]() |
43ab0283d9 | ||
![]() |
c27e9d5901 | ||
![]() |
e0d21627bb | ||
![]() |
1b1dd6ef88 | ||
![]() |
10700007d5 | ||
![]() |
c5ec8d04c1 | ||
![]() |
490b250db6 | ||
![]() |
0630423c8e | ||
![]() |
c2e06517e1 | ||
![]() |
b01ae33d1e | ||
![]() |
a55ee32058 | ||
![]() |
c3941d5bec | ||
![]() |
6020dc2b2d | ||
![]() |
7ab41e0c3a | ||
![]() |
c0a75f5b98 | ||
![]() |
efd4db40ef | ||
![]() |
3c3fe7bf83 | ||
![]() |
268762166a | ||
![]() |
53a1833e26 | ||
![]() |
1ff8b5fb9f | ||
![]() |
225b43ca3c | ||
![]() |
75a58d6381 | ||
![]() |
62814f083e | ||
![]() |
6f9deea873 | ||
![]() |
d3160eed9d | ||
![]() |
9b4a07de34 | ||
![]() |
d31eeac49e | ||
![]() |
84c5d27416 | ||
![]() |
17d77aa31f | ||
![]() |
388ec3e3d3 | ||
![]() |
f0829f9ef3 | ||
![]() |
81f481833c | ||
![]() |
a74c4168f3 | ||
![]() |
776dbc34f7 | ||
![]() |
168ac91ab8 | ||
![]() |
9bd26798b6 | ||
![]() |
4ae81a2de4 | ||
![]() |
3c314ced0a | ||
![]() |
ba9d0d7707 | ||
![]() |
38946e4b0f | ||
![]() |
f71242a036 | ||
![]() |
960fd9be38 | ||
![]() |
40844dcd76 | ||
![]() |
420d28c713 | ||
![]() |
5bbd6afaf1 | ||
![]() |
77a06c7604 | ||
![]() |
1f4f87d3bd | ||
![]() |
2e8d86575e | ||
![]() |
ef0659f436 | ||
![]() |
e18e69966f | ||
![]() |
e7b4b88055 | ||
![]() |
de65d1e1fc | ||
![]() |
7ea0862f95 | ||
![]() |
efc7049dfd | ||
![]() |
629549d76f | ||
![]() |
756fb795d6 | ||
![]() |
13d1974a5b | ||
![]() |
d3168a9022 | ||
![]() |
059378eedf | ||
![]() |
e973868a90 | ||
![]() |
2a0e5d6835 | ||
![]() |
5537abe2c3 | ||
![]() |
5eae235b3c | ||
![]() |
bfc7718a21 | ||
![]() |
405d6bee78 | ||
![]() |
f65f2da890 | ||
![]() |
30ab58c33d | ||
![]() |
87ba5a7eb6 | ||
![]() |
6e8593af91 | ||
![]() |
0ab1d3fc40 | ||
![]() |
f22d13e695 | ||
![]() |
cdde61a460 | ||
![]() |
989ce126f1 | ||
![]() |
28618e822e | ||
![]() |
6772381afc | ||
![]() |
75b45beabc | ||
![]() |
56d53e9b01 | ||
![]() |
3a8b04e2d1 | ||
![]() |
1ce7d66fb1 | ||
![]() |
7b5a9b69fe | ||
![]() |
837b22ccac | ||
![]() |
7146719393 | ||
![]() |
71ee604c69 | ||
![]() |
9945a5b813 | ||
![]() |
7254387042 | ||
![]() |
3a7f2a94a6 | ||
![]() |
6bea4aa96b | ||
![]() |
fa262bbceb | ||
![]() |
3139fe0170 | ||
![]() |
ef6c5de65b | ||
![]() |
07799563b5 | ||
![]() |
b1de4b7bd6 | ||
![]() |
2b8ae9a5ea | ||
![]() |
7c52d3ec5d | ||
![]() |
aefaa7619e | ||
![]() |
ca202290bf | ||
![]() |
cbdbc4cba2 | ||
![]() |
8abf904a78 | ||
![]() |
ecf7969c46 | ||
![]() |
a473e3d623 | ||
![]() |
1f8e90858e | ||
![]() |
2c2edca8fa | ||
![]() |
50e86ff1ca | ||
![]() |
02ecc5011a | ||
![]() |
6e666a018b | ||
![]() |
66fbb2ce1e | ||
![]() |
b00722ec0a | ||
![]() |
77b1413319 | ||
![]() |
87b8d60c9d | ||
![]() |
db5203e1ff | ||
![]() |
ea022670c4 | ||
![]() |
54b009cc49 | ||
![]() |
80c3acace9 | ||
![]() |
cea9428b47 | ||
![]() |
f8ffbfabbe | ||
![]() |
836a1e652b | ||
![]() |
d8544e0b84 | ||
![]() |
4817d7fddc | ||
![]() |
e6a385a85e | ||
![]() |
3634f68364 | ||
![]() |
f17ffa94fe | ||
![]() |
d52bcd46a1 | ||
![]() |
7e58b0b6fe | ||
![]() |
f451f1f65d | ||
![]() |
4d12e71fba | ||
![]() |
66fde7a212 | ||
![]() |
86eccf219d | ||
![]() |
677865f347 | ||
![]() |
eb4b3810e9 | ||
![]() |
5f26501ddf | ||
![]() |
b33a72f864 | ||
![]() |
675f43b968 | ||
![]() |
9f117a2e59 | ||
![]() |
a0844229a3 | ||
![]() |
114fcc144c | ||
![]() |
43372ff648 | ||
![]() |
b8ebbc5404 | ||
![]() |
28309f82f3 | ||
![]() |
c70fa391b6 | ||
![]() |
caab589dce | ||
![]() |
20370054e7 | ||
![]() |
f1882cb1e1 | ||
![]() |
2ed149852d | ||
![]() |
ac7226a0df | ||
![]() |
5705650ca8 | ||
![]() |
60855ca7c5 | ||
![]() |
b8d8d181f3 | ||
![]() |
6309160fc6 | ||
![]() |
fc0e6ed273 | ||
![]() |
ada0cee656 | ||
![]() |
6dde524d2c | ||
![]() |
6a631e1915 | ||
![]() |
bb6fa343cf | ||
![]() |
7557acde6c | ||
![]() |
25ed8952f9 | ||
![]() |
b93d94b0bd | ||
![]() |
33d75fd2fb | ||
![]() |
28a9855fd2 | ||
![]() |
9aad07621c | ||
![]() |
384cde6eaa | ||
![]() |
5ae98661ad | ||
![]() |
8f4d9ceca9 | ||
![]() |
83d9a1233e | ||
![]() |
522a287d79 | ||
![]() |
e052d4660d | ||
![]() |
39b0b2f032 | ||
![]() |
f5f8371865 | ||
![]() |
1191455d37 | ||
![]() |
011e151c91 | ||
![]() |
54aa40eac1 | ||
![]() |
621a1909ec | ||
![]() |
25db3c2940 | ||
![]() |
442290d7f0 | ||
![]() |
a6eb871f5e | ||
![]() |
b500c3f526 |
47
.github/CONTRIBUTING.md
vendored
47
.github/CONTRIBUTING.md
vendored
@@ -5,41 +5,64 @@ PLEASE READ THESE GUIDELINES CAREFULLY BEFORE ANY CONTRIBUTION!
|
|||||||
|
|
||||||
## Crash reporting
|
## Crash reporting
|
||||||
|
|
||||||
Do not report crashes in the GitHub issue tracker. NewPipe has an automated crash report system that will ask you to send a report via e-mail when a crash occurs. This contains all the data we need for debugging, and allows you to even add a comment to it. You'll see exactly what is sent, the system is 100% transparent.
|
Do not report crashes in the GitHub issue tracker. NewPipe has an automated crash report system that will ask you to
|
||||||
|
send a report via e-mail when a crash occurs. This contains all the data we need for debugging, and allows you to even
|
||||||
|
add a comment to it. You'll see exactly what is sent, the system is 100% transparent.
|
||||||
|
|
||||||
## Issue reporting/feature requests
|
## Issue reporting/feature requests
|
||||||
|
|
||||||
* Search the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) first to make sure your issue/feature hasn't been reported/requested before
|
* Search the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) first to make sure your issue/feature
|
||||||
|
hasn't been reported/requested before
|
||||||
* Check whether your issue/feature is already fixed/implemented
|
* Check whether your issue/feature is already fixed/implemented
|
||||||
|
* Check if the issue still exists in the latest release/beta version
|
||||||
* If you are an Android/Java developer, you are always welcome to fix/implement an issue/a feature yourself. PRs welcome!
|
* If you are an Android/Java developer, you are always welcome to fix/implement an issue/a feature yourself. PRs welcome!
|
||||||
* We use English for development. Issues in other languages will be closed and ignored.
|
* We use English for development. Issues in other languages will be closed and ignored.
|
||||||
* Please only add *one* issue at a time. Do not put multiple issues into one thread.
|
* Please only add *one* issue at a time. Do not put multiple issues into one thread.
|
||||||
|
* When reporting a bug please give us a context, and a description how to reproduce it.
|
||||||
|
* Issues that only contain a generated bug report, but no description might be closed.
|
||||||
|
|
||||||
## Bug Fixing
|
## Bug Fixing
|
||||||
* If you want to help NewPipe to become free of bugs (this is our utopic goal for NewPipe), you can send us an email to tnp@newpipe.schabi.org to let me know that you intend to help. We'll send you further instructions. You may, on request, register at our [Sentry](https://sentry.schabi.org) instance (see section "Crash reporting" for more information.
|
* If you want to help NewPipe to become free of bugs (this is our utopic goal for NewPipe), you can send us an email to
|
||||||
|
tnp@newpipe.schabi.org to let me know that you intend to help. We'll send you further instructions. You may, on request,
|
||||||
|
register at our [Sentry](https://sentry.schabi.org) instance (see section "Crash reporting" for more information.
|
||||||
|
|
||||||
## Translation
|
## Translation
|
||||||
|
|
||||||
* NewPipe can be translated via [Weblate](https://hosted.weblate.org/projects/newpipe/strings/). You can log in there with your GitHub account.
|
* NewPipe can be translated via [Weblate](https://hosted.weblate.org/projects/newpipe/strings/). You can log in there
|
||||||
|
with your GitHub account.
|
||||||
|
|
||||||
## Code contribution
|
## Code contribution
|
||||||
|
|
||||||
* Stick to NewPipe's style conventions (well, just look the other code and then do it the same way :))
|
* Stick to NewPipe's style conventions (well, just look the other code and then do it the same way :))
|
||||||
* Do not bring non-free software (e.g., binary blobs) into the project. Also, make sure you do not introduce Google libraries.
|
* Do not bring non-free software (e.g., binary blobs) into the project. Also, make sure you do not introduce Google
|
||||||
|
libraries.
|
||||||
* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy)
|
* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy)
|
||||||
* Make changes on a separate branch, not on the master branch. This is commonly known as *feature branch workflow*. You may then send your changes as a pull request on GitHub. Patches to the email address mentioned in this document might not be considered, GitHub is the primary platform.
|
* Make changes on a separate branch, not on the master branch. This is commonly known as *feature branch workflow*. You
|
||||||
* When submitting changes, you confirm that your code is licensed under the terms of the [GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.html).
|
may then send your changes as a pull request on GitHub. Patches to the email address mentioned in this document might
|
||||||
* Please test (compile and run) your code before you submit changes! Ideally, provide test feedback in the PR description. Untested code will **not** be merged!
|
not be considered, GitHub is the primary platform. (This only affects you if you are a member of TeamNewPipe)
|
||||||
|
* When submitting changes, you confirm that your code is licensed under the terms of the
|
||||||
|
[GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||||
|
* Please test (compile and run) your code before you submit changes! Ideally, provide test feedback in the PR
|
||||||
|
description. Untested code will **not** be merged!
|
||||||
* Try to figure out yourself why builds on our CI fail.
|
* Try to figure out yourself why builds on our CI fail.
|
||||||
* Make sure your PR is up-to-date with the rest of the code. Often, a simple click on "Update branch" will do the job, but if not, you are asked to merge the master branch manually and resolve the problems on your own. That will make the maintainers' jobs way easier.
|
* Make sure your PR is up-to-date with the rest of the code. Often, a simple click on "Update branch" will do the job,
|
||||||
* Please show intention to maintain your features and code after you contributed it. Unmaintained code is a hassle for the core developers, and just adds work. If you do not intend to maintain features you contributed, please think again about submission, or clearly state that in the description of your PR.
|
but if not, you are asked to merge the master branch manually and resolve the problems on your own. That will make the
|
||||||
|
maintainers' jobs way easier.
|
||||||
|
* Please show intention to maintain your features and code after you contributed it. Unmaintained code is a hassle for
|
||||||
|
the core developers, and just adds work. If you do not intend to maintain features you contributed, please think again
|
||||||
|
about submission, or clearly state that in the description of your PR.
|
||||||
* Respond yourselves if someone requests changes or otherwise raises issues about your PRs.
|
* Respond yourselves if someone requests changes or otherwise raises issues about your PRs.
|
||||||
* Check if your contributions align with the [fdroid inclusion guidelines](https://f-droid.org/en/docs/Inclusion_Policy/).
|
* Check if your contributions align with the [fdroid inclusion guidelines](https://f-droid.org/en/docs/Inclusion_Policy/).
|
||||||
* Check if your submission can be build with the current fdroid build server setup.
|
* Check if your submission can be build with the current fdroid build server setup.
|
||||||
|
* Send PR that only cover one specific issue/solution/bug. Do not send PRs that are huge and consists of multiple
|
||||||
|
independent solutions.
|
||||||
|
|
||||||
## Communication
|
## Communication
|
||||||
|
|
||||||
* WE DO NOW HAVE A MAILING LIST: [newpipe@list.schabi.org](https://list.schabi.org/cgi-bin/mailman/listinfo/newpipe).
|
* WE DO NOW HAVE A MAILING LIST: [newpipe@list.schabi.org](https://list.schabi.org/cgi-bin/mailman/listinfo/newpipe).
|
||||||
* There is an IRC channel on Freenode which is regularly visited by the core team and other developers: [#newpipe](irc:irc.freenode.net/newpipe). [Click here for Webchat](https://webchat.freenode.net/?channels=newpipe)!
|
* There is an IRC channel on Freenode which is regularly visited by the core team and other developers:
|
||||||
* If you want to get in touch with the core team or one of our other contributors you can send an email to tnp(at)schabi.org. Please do not send issue reports, they will be ignored and remain unanswered! Use the GitHub issue tracker described above!
|
[#newpipe](irc:irc.freenode.net/newpipe). [Click here for Webchat](https://webchat.freenode.net/?channels=newpipe)!
|
||||||
|
* If you want to get in touch with the core team or one of our other contributors you can send an email to
|
||||||
|
tnp(at)schabi.org. Please do not send issue reports, they will be ignored and remain unanswered! Use the GitHub issue
|
||||||
|
tracker described above!
|
||||||
* Feel free to post suggestions, changes, ideas etc. on GitHub, IRC or the mailing list!
|
* Feel free to post suggestions, changes, ideas etc. on GitHub, IRC or the mailing list!
|
||||||
|
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
liberapay: TeamNewPipe
|
1
.github/ISSUE_TEMPLATE.md
vendored
1
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,2 +1,3 @@
|
|||||||
- [ ] I carefully read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them.
|
- [ ] I carefully read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md) and agree to them.
|
||||||
- [ ] I checked if the issue/feature exists in the latest version.
|
- [ ] I checked if the issue/feature exists in the latest version.
|
||||||
|
- [ ] I did use the [incredible bugreport to markdown converter](https://teamnewpipe.github.io/CrashReportToMarkdown/) to paste bug reports.
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,7 +7,6 @@
|
|||||||
/app/app.iml
|
/app/app.iml
|
||||||
/.idea
|
/.idea
|
||||||
/*.iml
|
/*.iml
|
||||||
gradle.properties
|
|
||||||
*~
|
*~
|
||||||
.weblate
|
.weblate
|
||||||
*.class
|
*.class
|
||||||
|
@@ -5,13 +5,13 @@ android:
|
|||||||
components:
|
components:
|
||||||
# The BuildTools version used by NewPipe
|
# The BuildTools version used by NewPipe
|
||||||
- tools
|
- tools
|
||||||
- build-tools-27.0.1
|
- build-tools-28.0.3
|
||||||
|
|
||||||
# The SDK version used to compile NewPipe
|
# The SDK version used to compile NewPipe
|
||||||
- android-27
|
- android-28
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- yes | sdkmanager "platforms;android-27"
|
- yes | sdkmanager "platforms;android-28"
|
||||||
script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDebugUnitTest
|
script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDebugUnitTest
|
||||||
|
|
||||||
licenses:
|
licenses:
|
||||||
|
Binary file not shown.
@@ -1,131 +0,0 @@
|
|||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.regex.*;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.charset.Charset;
|
|
||||||
|
|
||||||
public final class CheckTranslations {
|
|
||||||
|
|
||||||
private static boolean debug = false;
|
|
||||||
private static boolean plurals = false;
|
|
||||||
private static boolean empty = false;
|
|
||||||
private static boolean remove = false;
|
|
||||||
private static int checks = 0;
|
|
||||||
private static int matches = 0;
|
|
||||||
private static Pattern p, e;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Search translated strings.xml files for empty item / plural tags
|
|
||||||
* and remove them.
|
|
||||||
* @param args directories which contain string.xml files (in any subdirectory)
|
|
||||||
* -e option to find all empty string tags
|
|
||||||
* -p option to find all empty plurals and item tags
|
|
||||||
* -r option to remove all occurrences from the files
|
|
||||||
* -d option to see more details
|
|
||||||
*/
|
|
||||||
public static void main(String[] args) {
|
|
||||||
if (args.length < 1 || (args[0].equals("-d") && args.length < 2)) {
|
|
||||||
System.out.println("Not enough arguments");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < args.length; i++) {
|
|
||||||
switch (args[i]) {
|
|
||||||
case "-d":
|
|
||||||
debug = true;
|
|
||||||
break;
|
|
||||||
case "-p":
|
|
||||||
plurals = true;
|
|
||||||
break;
|
|
||||||
case "-e":
|
|
||||||
empty = true;
|
|
||||||
break;
|
|
||||||
case "-r":
|
|
||||||
remove = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!plurals && !empty) {
|
|
||||||
plurals = true;
|
|
||||||
empty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = Pattern.compile("(<item quantity=\")(zero|one|two|three|few|many|other)(\"></item>|\"/>)");
|
|
||||||
e = Pattern.compile("(<string[\\sa-z_\\\"=]*)((><\\/string>|\\/>){1})");
|
|
||||||
|
|
||||||
for (int i = 0; i < args.length; i++) {
|
|
||||||
if (!args[i].equals("-d") && !args[i].equals("-p") && !args[i].equals("-e") && !args[i].equals("-r")) {
|
|
||||||
File f = new File(args[i]);
|
|
||||||
if (f.exists() && !f.isDirectory()) {
|
|
||||||
checkFile(f);
|
|
||||||
} else if (f.isDirectory()) {
|
|
||||||
checkFiles(f.listFiles());
|
|
||||||
} else {
|
|
||||||
System.out.println("'" + args[i] + "' does not exist!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
System.out.println(checks + " files were checked.");
|
|
||||||
System.out.println(matches + " corrupt lines detected.");
|
|
||||||
if (remove) System.out.println(matches + " corrupt lines removed.");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static void checkFiles(File[] f) {
|
|
||||||
for (int i = 0; i < f.length; i++) {
|
|
||||||
if (f[i].exists() && !f[i].isDirectory()) {
|
|
||||||
if (f[i].toString().contains("strings.xml")) {
|
|
||||||
checkFile(f[i]);
|
|
||||||
}
|
|
||||||
} else if (f[i].isDirectory()) {
|
|
||||||
checkFiles(f[i].listFiles());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void checkFile(File f) {
|
|
||||||
// Do not check our original English strings to cause no unwanted changes
|
|
||||||
// Btw. there should not be empty plural/item tags
|
|
||||||
if (f.toString().contains("values/strings.xml")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (debug) System.out.println("Checking " + f.toString());
|
|
||||||
checks++;
|
|
||||||
|
|
||||||
|
|
||||||
List<String> lines = new ArrayList<String>();
|
|
||||||
boolean checkFailed = false;
|
|
||||||
|
|
||||||
try (BufferedReader br = new BufferedReader(new FileReader(f))) {
|
|
||||||
String line;
|
|
||||||
int ln = 0;
|
|
||||||
while ((line = br.readLine()) != null) {
|
|
||||||
ln++;
|
|
||||||
if (plurals && p.matcher(line).find()) {
|
|
||||||
matches++;
|
|
||||||
if (debug) System.out.println(" Line " + ln + " was " + ((remove) ? "removed" : "detected") + ": '" + line + "'");
|
|
||||||
checkFailed = true;
|
|
||||||
} else if (empty && e.matcher(line).find()) {
|
|
||||||
matches++;
|
|
||||||
checkFailed = true;
|
|
||||||
if (debug) System.out.println(" Line " + ln + " was " + ((remove) ? "removed" : "detected") + ": '" + line + "'");
|
|
||||||
} else {
|
|
||||||
if (remove) lines.add(line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
br.close();
|
|
||||||
if (remove && checkFailed) {
|
|
||||||
Files.write(f.toPath(), lines, Charset.forName("UTF-8"));
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
System.out.println(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
2
app/.gitignore
vendored
2
app/.gitignore
vendored
@@ -1,3 +1,3 @@
|
|||||||
.gitignore
|
.gitignore
|
||||||
/build
|
/build
|
||||||
app.iml
|
*.iml
|
||||||
|
111
app/build.gradle
111
app/build.gradle
@@ -1,38 +1,35 @@
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
apply plugin: 'kotlin-android-extensions'
|
||||||
|
apply plugin: 'kotlin-kapt'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 27
|
compileSdkVersion 28
|
||||||
buildToolsVersion '27.0.1'
|
buildToolsVersion '28.0.3'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "org.schabi.newpipe"
|
applicationId "org.schabi.newpipe"
|
||||||
minSdkVersion 15
|
minSdkVersion 19
|
||||||
targetSdkVersion 27
|
targetSdkVersion 28
|
||||||
versionCode 44
|
versionCode 860
|
||||||
versionName "0.11.3"
|
versionName "0.18.6"
|
||||||
|
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
minifyEnabled true
|
minifyEnabled true
|
||||||
shrinkResources true
|
shrinkResources true
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
}
|
}
|
||||||
|
|
||||||
debug {
|
debug {
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
|
|
||||||
debuggable true
|
debuggable true
|
||||||
applicationIdSuffix ".debug"
|
applicationIdSuffix ".debug"
|
||||||
}
|
}
|
||||||
beta {
|
|
||||||
minifyEnabled true
|
|
||||||
shrinkResources true
|
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
|
||||||
|
|
||||||
applicationIdSuffix ".beta"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lintOptions {
|
lintOptions {
|
||||||
@@ -41,52 +38,78 @@ android {
|
|||||||
// but continue the build even when errors are found:
|
// but continue the build even when errors are found:
|
||||||
abortOnError false
|
abortOnError false
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_1_7
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_7
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
supportLibVersion = '27.0.2'
|
androidxLibVersion = '1.0.0'
|
||||||
|
exoPlayerLibVersion = '2.10.8'
|
||||||
|
roomDbLibVersion = '2.1.0'
|
||||||
|
leakCanaryLibVersion = '1.5.4' //1.6.1
|
||||||
|
okHttpLibVersion = '3.12.6'
|
||||||
|
icepickLibVersion = '3.2.0'
|
||||||
|
stethoLibVersion = '1.5.0'
|
||||||
|
markwonVersion = '4.2.1'
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2') {
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||||
|
|
||||||
|
androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', {
|
||||||
exclude module: 'support-annotations'
|
exclude module: 'support-annotations'
|
||||||
}
|
})
|
||||||
|
|
||||||
implementation 'com.github.TeamNewPipe:NewPipeExtractor:5f2d0cf6b5dfac2965b1cf400'
|
|
||||||
|
|
||||||
|
implementation 'com.github.TeamNewPipe:NewPipeExtractor:6446abc6d'
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
testImplementation 'org.mockito:mockito-core:1.10.19'
|
testImplementation 'org.mockito:mockito-core:2.23.0'
|
||||||
|
|
||||||
implementation "com.android.support:appcompat-v7:$supportLibVersion"
|
implementation 'androidx.appcompat:appcompat:1.1.0'
|
||||||
implementation "com.android.support:support-v4:$supportLibVersion"
|
implementation "androidx.legacy:legacy-support-v4:${androidxLibVersion}"
|
||||||
implementation "com.android.support:design:$supportLibVersion"
|
implementation "com.google.android.material:material:${androidxLibVersion}"
|
||||||
implementation "com.android.support:recyclerview-v7:$supportLibVersion"
|
implementation "androidx.recyclerview:recyclerview:${androidxLibVersion}"
|
||||||
implementation "com.android.support:preference-v14:$supportLibVersion"
|
implementation "androidx.legacy:legacy-preference-v14:${androidxLibVersion}"
|
||||||
|
implementation "androidx.cardview:cardview:${androidxLibVersion}"
|
||||||
|
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
||||||
|
|
||||||
implementation 'com.google.code.gson:gson:2.8.2'
|
// Originally in NewPipeExtractor
|
||||||
implementation 'ch.acra:acra:4.9.2'
|
implementation 'com.grack:nanojson:1.1'
|
||||||
|
implementation 'org.jsoup:jsoup:1.9.2'
|
||||||
|
|
||||||
|
implementation 'ch.acra:acra:4.9.2' //4.11
|
||||||
|
|
||||||
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
|
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
|
||||||
implementation 'de.hdodenhof:circleimageview:2.2.0'
|
implementation 'de.hdodenhof:circleimageview:2.2.0'
|
||||||
implementation 'com.github.nirhart:ParallaxScroll:dd53d1f9d1'
|
implementation 'com.nononsenseapps:filepicker:4.2.1'
|
||||||
implementation 'com.nononsenseapps:filepicker:3.0.1'
|
|
||||||
implementation 'com.google.android.exoplayer:exoplayer:r2.5.4'
|
|
||||||
|
|
||||||
debugImplementation 'com.facebook.stetho:stetho:1.5.0'
|
implementation "com.google.android.exoplayer:exoplayer:${exoPlayerLibVersion}"
|
||||||
debugImplementation 'com.facebook.stetho:stetho-urlconnection:1.5.0'
|
implementation "com.google.android.exoplayer:extension-mediasession:${exoPlayerLibVersion}"
|
||||||
debugImplementation 'com.android.support:multidex:1.0.2'
|
|
||||||
|
|
||||||
implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
|
debugImplementation "com.facebook.stetho:stetho:${stethoLibVersion}"
|
||||||
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
|
debugImplementation "com.facebook.stetho:stetho-urlconnection:${stethoLibVersion}"
|
||||||
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
|
debugImplementation 'androidx.multidex:multidex:2.0.1'
|
||||||
|
|
||||||
implementation 'android.arch.persistence.room:runtime:1.0.0'
|
implementation 'io.reactivex.rxjava2:rxjava:2.2.2'
|
||||||
implementation 'android.arch.persistence.room:rxjava2:1.0.0'
|
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
|
||||||
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
|
implementation 'com.jakewharton.rxbinding2:rxbinding:2.1.1'
|
||||||
|
implementation 'org.ocpsoft.prettytime:prettytime:4.0.3.Final'
|
||||||
|
|
||||||
implementation 'frankiesardo:icepick:3.2.0'
|
implementation "androidx.room:room-runtime:${roomDbLibVersion}"
|
||||||
annotationProcessor 'frankiesardo:icepick-processor:3.2.0'
|
implementation "androidx.room:room-rxjava2:${roomDbLibVersion}"
|
||||||
|
kapt "androidx.room:room-compiler:${roomDbLibVersion}"
|
||||||
|
|
||||||
|
implementation "frankiesardo:icepick:${icepickLibVersion}"
|
||||||
|
kapt "frankiesardo:icepick-processor:${icepickLibVersion}"
|
||||||
|
|
||||||
|
debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakCanaryLibVersion}"
|
||||||
|
releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:${leakCanaryLibVersion}"
|
||||||
|
|
||||||
|
implementation "com.squareup.okhttp3:okhttp:${okHttpLibVersion}"
|
||||||
|
debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoLibVersion}"
|
||||||
|
|
||||||
|
implementation "io.noties.markwon:core:${markwonVersion}"
|
||||||
|
implementation "io.noties.markwon:linkify:${markwonVersion}"
|
||||||
}
|
}
|
||||||
|
16
app/proguard-rules.pro
vendored
16
app/proguard-rules.pro
vendored
@@ -17,6 +17,9 @@
|
|||||||
#}
|
#}
|
||||||
|
|
||||||
-dontobfuscate
|
-dontobfuscate
|
||||||
|
-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; }
|
||||||
|
-keep class org.ocpsoft.prettytime.i18n.** { *; }
|
||||||
|
|
||||||
-keep class org.mozilla.javascript.** { *; }
|
-keep class org.mozilla.javascript.** { *; }
|
||||||
|
|
||||||
-keep class org.mozilla.classfile.ClassFileWriter
|
-keep class org.mozilla.classfile.ClassFileWriter
|
||||||
@@ -35,3 +38,16 @@
|
|||||||
@icepick.* <fields>;
|
@icepick.* <fields>;
|
||||||
}
|
}
|
||||||
-keepnames class * { @icepick.State *;}
|
-keepnames class * { @icepick.State *;}
|
||||||
|
|
||||||
|
# Rules for OkHttp. Copy paste from https://github.com/square/okhttp
|
||||||
|
-dontwarn okhttp3.**
|
||||||
|
-dontwarn okio.**
|
||||||
|
-dontwarn javax.annotation.**
|
||||||
|
# A resource is loaded with a relative path so the package of this class must be preserved.
|
||||||
|
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
|
||||||
|
-keepclassmembers class * implements java.io.Serializable {
|
||||||
|
static final long serialVersionUID;
|
||||||
|
!static !transient <fields>;
|
||||||
|
private void writeObject(java.io.ObjectOutputStream);
|
||||||
|
private void readObject(java.io.ObjectInputStream);
|
||||||
|
}
|
||||||
|
@@ -1,13 +0,0 @@
|
|||||||
package org.schabi.newpipe;
|
|
||||||
|
|
||||||
import android.app.Application;
|
|
||||||
import android.test.ApplicationTestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
|
|
||||||
*/
|
|
||||||
public class ApplicationTest extends ApplicationTestCase<Application> {
|
|
||||||
public ApplicationTest() {
|
|
||||||
super(Application.class);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,8 +1,8 @@
|
|||||||
package org.schabi.newpipe.report;
|
package org.schabi.newpipe.report;
|
||||||
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.support.test.filters.LargeTest;
|
import androidx.test.filters.LargeTest;
|
||||||
import android.support.test.runner.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
|
||||||
|
|
||||||
<application
|
|
||||||
android:label="NewPipe Beta"
|
|
||||||
tools:replace="android:label">
|
|
||||||
</application>
|
|
||||||
|
|
||||||
</manifest>
|
|
Binary file not shown.
Before Width: | Height: | Size: 5.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 3.0 KiB |
Binary file not shown.
Before Width: | Height: | Size: 8.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 13 KiB |
Binary file not shown.
Before Width: | Height: | Size: 19 KiB |
@@ -1,9 +1,26 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.multidex.MultiDex;
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.multidex.MultiDex;
|
||||||
|
|
||||||
import com.facebook.stetho.Stetho;
|
import com.facebook.stetho.Stetho;
|
||||||
|
import com.facebook.stetho.okhttp3.StethoInterceptor;
|
||||||
|
import com.squareup.leakcanary.AndroidHeapDumper;
|
||||||
|
import com.squareup.leakcanary.DefaultLeakDirectoryProvider;
|
||||||
|
import com.squareup.leakcanary.HeapDumper;
|
||||||
|
import com.squareup.leakcanary.LeakCanary;
|
||||||
|
import com.squareup.leakcanary.LeakDirectoryProvider;
|
||||||
|
import com.squareup.leakcanary.RefWatcher;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.extractor.downloader.Downloader;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
|
||||||
public class DebugApp extends App {
|
public class DebugApp extends App {
|
||||||
private static final String TAG = DebugApp.class.toString();
|
private static final String TAG = DebugApp.class.toString();
|
||||||
@@ -17,10 +34,15 @@ public class DebugApp extends App {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
|
||||||
initStetho();
|
initStetho();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Downloader getDownloader() {
|
||||||
|
return DownloaderImpl.init(new OkHttpClient.Builder()
|
||||||
|
.addNetworkInterceptor(new StethoInterceptor()));
|
||||||
|
}
|
||||||
|
|
||||||
private void initStetho() {
|
private void initStetho() {
|
||||||
// Create an InitializerBuilder
|
// Create an InitializerBuilder
|
||||||
Stetho.InitializerBuilder initializerBuilder =
|
Stetho.InitializerBuilder initializerBuilder =
|
||||||
@@ -42,4 +64,41 @@ public class DebugApp extends App {
|
|||||||
// Initialize Stetho with the Initializer
|
// Initialize Stetho with the Initializer
|
||||||
Stetho.initialize(initializer);
|
Stetho.initialize(initializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isDisposedRxExceptionsReported() {
|
||||||
|
return PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
.getBoolean(getString(R.string.allow_disposed_exceptions_key), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected RefWatcher installLeakCanary() {
|
||||||
|
return LeakCanary.refWatcher(this)
|
||||||
|
.heapDumper(new ToggleableHeapDumper(this))
|
||||||
|
// give each object 10 seconds to be gc'ed, before leak canary gets nosy on it
|
||||||
|
.watchDelay(10, TimeUnit.SECONDS)
|
||||||
|
.buildAndInstall();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ToggleableHeapDumper implements HeapDumper {
|
||||||
|
private final HeapDumper dumper;
|
||||||
|
private final SharedPreferences preferences;
|
||||||
|
private final String dumpingAllowanceKey;
|
||||||
|
|
||||||
|
ToggleableHeapDumper(@NonNull final Context context) {
|
||||||
|
LeakDirectoryProvider leakDirectoryProvider = new DefaultLeakDirectoryProvider(context);
|
||||||
|
this.dumper = new AndroidHeapDumper(context, leakDirectoryProvider);
|
||||||
|
this.preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
this.dumpingAllowanceKey = context.getString(R.string.allow_heap_dumping_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isDumpingAllowed() {
|
||||||
|
return preferences.getBoolean(dumpingAllowanceKey, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public File dumpHeap() {
|
||||||
|
return isDumpingAllowed() ? dumper.dumpHeap() : HeapDumper.RETRY_LATER;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".App"
|
android:name=".App"
|
||||||
@@ -16,7 +17,7 @@
|
|||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:logo="@mipmap/ic_launcher"
|
android:logo="@mipmap/ic_launcher"
|
||||||
android:theme="@style/DarkTheme"
|
android:theme="@style/OpeningTheme"
|
||||||
tools:ignore="AllowBackup">
|
tools:ignore="AllowBackup">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
@@ -28,15 +29,19 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<receiver android:name="androidx.media.session.MediaButtonReceiver" >
|
||||||
android:name=".player.old.PlayVideoActivity"
|
<intent-filter>
|
||||||
android:configChanges="orientation|keyboardHidden|screenSize"
|
<action android:name="android.intent.action.MEDIA_BUTTON" />
|
||||||
android:theme="@style/VideoPlayerTheme"
|
</intent-filter>
|
||||||
tools:ignore="UnusedAttribute"/>
|
</receiver>
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name=".player.BackgroundPlayer"
|
android:name=".player.BackgroundPlayer"
|
||||||
android:exported="false"/>
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MEDIA_BUTTON" />
|
||||||
|
</intent-filter>
|
||||||
|
</service>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".player.BackgroundPlayerActivity"
|
android:name=".player.BackgroundPlayerActivity"
|
||||||
@@ -57,7 +62,7 @@
|
|||||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
|
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:theme="@style/PlayerTheme"/>
|
android:theme="@style/VideoPlayerTheme"/>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".settings.SettingsActivity"
|
android:name=".settings.SettingsActivity"
|
||||||
@@ -67,9 +72,8 @@
|
|||||||
android:name=".about.AboutActivity"
|
android:name=".about.AboutActivity"
|
||||||
android:label="@string/title_activity_about"/>
|
android:label="@string/title_activity_about"/>
|
||||||
|
|
||||||
<activity
|
<service android:name=".local.subscription.services.SubscriptionsImportService"/>
|
||||||
android:name=".history.HistoryActivity"
|
<service android:name=".local.subscription.services.SubscriptionsExportService"/>
|
||||||
android:label="@string/title_activity_history"/>
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".PanicResponderActivity"
|
android:name=".PanicResponderActivity"
|
||||||
@@ -109,22 +113,26 @@
|
|||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ReCaptchaActivity"
|
android:name=".ReCaptchaActivity"
|
||||||
android:label="@string/reCaptchaActivity"/>
|
android:label="@string/recaptcha"/>
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="android.support.v4.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
android:authorities="${applicationId}.provider"
|
android:authorities="${applicationId}.provider"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:grantUriPermissions="true">
|
android:grantUriPermissions="true">
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||||
android:resource="@xml/provider_paths"/>
|
android:resource="@xml/nnf_provider_paths"/>
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".RouterActivity"
|
android:name=".RouterActivity"
|
||||||
|
android:excludeFromRecents="true"
|
||||||
|
android:label="@string/preferred_open_action_share_menu_title"
|
||||||
android:taskAffinity=""
|
android:taskAffinity=""
|
||||||
android:theme="@android:style/Theme.NoDisplay">
|
android:theme="@style/RouterActivityThemeDark">
|
||||||
|
|
||||||
|
<!-- Youtube filter -->
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
||||||
@@ -146,6 +154,7 @@
|
|||||||
<!-- channel prefix -->
|
<!-- channel prefix -->
|
||||||
<data android:pathPrefix="/channel/"/>
|
<data android:pathPrefix="/channel/"/>
|
||||||
<data android:pathPrefix="/user/"/>
|
<data android:pathPrefix="/user/"/>
|
||||||
|
<data android:pathPrefix="/c/"/>
|
||||||
<!-- playlist prefix -->
|
<!-- playlist prefix -->
|
||||||
<data android:pathPrefix="/playlist"/>
|
<data android:pathPrefix="/playlist"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@@ -170,22 +179,24 @@
|
|||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
|
|
||||||
|
<data android:scheme="http"/>
|
||||||
|
<data android:scheme="https"/>
|
||||||
|
<data android:host="www.youtube-nocookie.com"/>
|
||||||
|
<data android:pathPrefix="/embed/"/>
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
||||||
|
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
|
|
||||||
<data android:scheme="vnd.youtube"/>
|
<data android:scheme="vnd.youtube"/>
|
||||||
<data android:scheme="vnd.youtube.launch"/>
|
<data android:scheme="vnd.youtube.launch"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.SEND"/>
|
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<!-- Hooktube filter -->
|
||||||
|
|
||||||
<data android:mimeType="text/plain"/>
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
<activity
|
|
||||||
android:name=".RouterPopupActivity"
|
|
||||||
android:label="@string/popup_mode_share_menu_title"
|
|
||||||
android:taskAffinity=""
|
|
||||||
android:theme="@style/PopupPermissionsTheme">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
||||||
@@ -196,15 +207,18 @@
|
|||||||
|
|
||||||
<data android:scheme="http"/>
|
<data android:scheme="http"/>
|
||||||
<data android:scheme="https"/>
|
<data android:scheme="https"/>
|
||||||
<data android:host="youtube.com"/>
|
<data android:host="hooktube.com"/>
|
||||||
<data android:host="m.youtube.com"/>
|
<data android:host="*.hooktube.com"/>
|
||||||
<data android:host="www.youtube.com"/>
|
|
||||||
<!-- video prefix -->
|
<!-- video prefix -->
|
||||||
<data android:pathPrefix="/v/"/>
|
<data android:pathPrefix="/v/"/>
|
||||||
<data android:pathPrefix="/embed/"/>
|
<data android:pathPrefix="/embed/"/>
|
||||||
<data android:pathPrefix="/watch"/>
|
<data android:pathPrefix="/watch"/>
|
||||||
<data android:pathPrefix="/attribution_link"/>
|
<!-- channel prefix -->
|
||||||
|
<data android:pathPrefix="/channel/"/>
|
||||||
|
<data android:pathPrefix="/user/"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
<!-- Invidious filter -->
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
||||||
@@ -215,9 +229,32 @@
|
|||||||
|
|
||||||
<data android:scheme="http"/>
|
<data android:scheme="http"/>
|
||||||
<data android:scheme="https"/>
|
<data android:scheme="https"/>
|
||||||
<data android:host="youtu.be"/>
|
<data android:host="invidio.us"/>
|
||||||
<data android:pathPrefix="/"/>
|
<data android:host="dev.invidio.us"/>
|
||||||
|
<data android:host="www.invidio.us"/>
|
||||||
|
<data android:host="invidious.snopyta.org"/>
|
||||||
|
<data android:host="de.invidious.snopyta.org"/>
|
||||||
|
<data android:host="fi.invidious.snopyta.org"/>
|
||||||
|
<data android:host="vid.wxzm.sx"/>
|
||||||
|
<data android:host="invidious.kabi.tk"/>
|
||||||
|
<data android:host="invidiou.sh"/>
|
||||||
|
<data android:host="www.invidiou.sh"/>
|
||||||
|
<data android:host="no.invidiou.sh"/>
|
||||||
|
<data android:host="invidious.enkirton.net"/>
|
||||||
|
<data android:host="tube.poal.co"/>
|
||||||
|
<data android:host="invidious.13ad.de"/>
|
||||||
|
<data android:host="yt.elukerio.org"/>
|
||||||
|
<!-- video prefix -->
|
||||||
|
<data android:pathPrefix="/embed/"/>
|
||||||
|
<data android:pathPrefix="/watch"/>
|
||||||
|
<!-- channel prefix -->
|
||||||
|
<data android:pathPrefix="/channel/"/>
|
||||||
|
<data android:pathPrefix="/user/"/>
|
||||||
|
<!-- playlist prefix -->
|
||||||
|
<data android:pathPrefix="/playlist"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
<!-- Soundcloud filter -->
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH"/>
|
||||||
@@ -226,14 +263,24 @@
|
|||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
|
|
||||||
<data android:scheme="vnd.youtube"/>
|
<data android:scheme="http"/>
|
||||||
<data android:scheme="vnd.youtube.launch"/>
|
<data android:scheme="https"/>
|
||||||
|
<data android:host="soundcloud.com"/>
|
||||||
|
<data android:host="m.soundcloud.com"/>
|
||||||
|
<data android:host="www.soundcloud.com"/>
|
||||||
|
<data android:pathPrefix="/"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
<!-- Share filter -->
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND"/>
|
<action android:name="android.intent.action.SEND"/>
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
<data android:mimeType="text/plain"/>
|
<data android:mimeType="text/plain"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".RouterActivity$FetcherService"
|
||||||
|
android:exported="false"/>
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
@@ -0,0 +1,82 @@
|
|||||||
|
package com.google.android.material.appbar;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.MotionEvent;
|
||||||
|
import android.widget.OverScroller;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.coordinatorlayout.widget.CoordinatorLayout;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
// check this https://stackoverflow.com/questions/56849221/recyclerview-fling-causes-laggy-while-appbarlayout-is-scrolling/57997489#57997489
|
||||||
|
public final class FlingBehavior extends AppBarLayout.Behavior {
|
||||||
|
|
||||||
|
public FlingBehavior(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
|
||||||
|
switch (ev.getActionMasked()) {
|
||||||
|
case MotionEvent.ACTION_DOWN:
|
||||||
|
// remove reference to old nested scrolling child
|
||||||
|
resetNestedScrollingChild();
|
||||||
|
// Stop fling when your finger touches the screen
|
||||||
|
stopAppBarLayoutFling();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return super.onInterceptTouchEvent(parent, child, ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private OverScroller getScrollerField() {
|
||||||
|
try {
|
||||||
|
Class<?> headerBehaviorType = this.getClass().getSuperclass().getSuperclass().getSuperclass();
|
||||||
|
if (headerBehaviorType != null) {
|
||||||
|
Field field = headerBehaviorType.getDeclaredField("scroller");
|
||||||
|
field.setAccessible(true);
|
||||||
|
return ((OverScroller) field.get(this));
|
||||||
|
}
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||||
|
// ?
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private Field getLastNestedScrollingChildRefField() {
|
||||||
|
try {
|
||||||
|
Class<?> headerBehaviorType = this.getClass().getSuperclass().getSuperclass();
|
||||||
|
if (headerBehaviorType != null) {
|
||||||
|
Field field = headerBehaviorType.getDeclaredField("lastNestedScrollingChildRef");
|
||||||
|
field.setAccessible(true);
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
// ?
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void resetNestedScrollingChild(){
|
||||||
|
Field field = getLastNestedScrollingChildRefField();
|
||||||
|
if(field != null){
|
||||||
|
try {
|
||||||
|
Object value = field.get(this);
|
||||||
|
if(value != null) field.set(this, null);
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
// ?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopAppBarLayoutFling() {
|
||||||
|
OverScroller scroller = getScrollerField();
|
||||||
|
if (scroller != null) scroller.forceFinished(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -1,5 +1,6 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
|
import android.annotation.TargetApi;
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.app.NotificationChannel;
|
import android.app.NotificationChannel;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
@@ -7,8 +8,13 @@ import android.content.Context;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.nostra13.universalimageloader.cache.memory.impl.LRULimitedMemoryCache;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||||
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
|
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
|
||||||
|
import com.squareup.leakcanary.LeakCanary;
|
||||||
|
import com.squareup.leakcanary.RefWatcher;
|
||||||
|
|
||||||
import org.acra.ACRA;
|
import org.acra.ACRA;
|
||||||
import org.acra.config.ACRAConfiguration;
|
import org.acra.config.ACRAConfiguration;
|
||||||
@@ -16,19 +22,26 @@ import org.acra.config.ACRAConfigurationException;
|
|||||||
import org.acra.config.ConfigurationBuilder;
|
import org.acra.config.ConfigurationBuilder;
|
||||||
import org.acra.sender.ReportSenderFactory;
|
import org.acra.sender.ReportSenderFactory;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
|
import org.schabi.newpipe.extractor.downloader.Downloader;
|
||||||
import org.schabi.newpipe.report.AcraReportSenderFactory;
|
import org.schabi.newpipe.report.AcraReportSenderFactory;
|
||||||
import org.schabi.newpipe.report.ErrorActivity;
|
import org.schabi.newpipe.report.ErrorActivity;
|
||||||
import org.schabi.newpipe.report.UserAction;
|
import org.schabi.newpipe.report.UserAction;
|
||||||
import org.schabi.newpipe.settings.SettingsActivity;
|
import org.schabi.newpipe.settings.SettingsActivity;
|
||||||
import org.schabi.newpipe.util.ExtractorHelper;
|
import org.schabi.newpipe.util.ExtractorHelper;
|
||||||
|
import org.schabi.newpipe.util.Localization;
|
||||||
|
import org.schabi.newpipe.util.ServiceHelper;
|
||||||
import org.schabi.newpipe.util.StateSaver;
|
import org.schabi.newpipe.util.StateSaver;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InterruptedIOException;
|
import java.io.InterruptedIOException;
|
||||||
import java.net.SocketException;
|
import java.net.SocketException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import io.reactivex.annotations.NonNull;
|
import io.reactivex.annotations.NonNull;
|
||||||
import io.reactivex.exceptions.CompositeException;
|
import io.reactivex.exceptions.CompositeException;
|
||||||
|
import io.reactivex.exceptions.MissingBackpressureException;
|
||||||
|
import io.reactivex.exceptions.OnErrorNotImplementedException;
|
||||||
import io.reactivex.exceptions.UndeliverableException;
|
import io.reactivex.exceptions.UndeliverableException;
|
||||||
import io.reactivex.functions.Consumer;
|
import io.reactivex.functions.Consumer;
|
||||||
import io.reactivex.plugins.RxJavaPlugins;
|
import io.reactivex.plugins.RxJavaPlugins;
|
||||||
@@ -53,9 +66,12 @@ import io.reactivex.plugins.RxJavaPlugins;
|
|||||||
|
|
||||||
public class App extends Application {
|
public class App extends Application {
|
||||||
protected static final String TAG = App.class.toString();
|
protected static final String TAG = App.class.toString();
|
||||||
|
private RefWatcher refWatcher;
|
||||||
|
private static App app;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private static final Class<? extends ReportSenderFactory>[] reportSenderFactoryClasses = new Class[]{AcraReportSenderFactory.class};
|
private static final Class<? extends ReportSenderFactory>[]
|
||||||
|
reportSenderFactoryClasses = new Class[]{AcraReportSenderFactory.class};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void attachBaseContext(Context base) {
|
protected void attachBaseContext(Context base) {
|
||||||
@@ -68,54 +84,109 @@ public class App extends Application {
|
|||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
|
||||||
|
if (LeakCanary.isInAnalyzerProcess(this)) {
|
||||||
|
// This process is dedicated to LeakCanary for heap analysis.
|
||||||
|
// You should not init your app in this process.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
refWatcher = installLeakCanary();
|
||||||
|
|
||||||
|
app = this;
|
||||||
|
|
||||||
// Initialize settings first because others inits can use its values
|
// Initialize settings first because others inits can use its values
|
||||||
SettingsActivity.initSettings(this);
|
SettingsActivity.initSettings(this);
|
||||||
|
|
||||||
NewPipe.init(Downloader.getInstance());
|
NewPipe.init(getDownloader(),
|
||||||
NewPipeDatabase.init(this);
|
Localization.getPreferredLocalization(this),
|
||||||
|
Localization.getPreferredContentCountry(this));
|
||||||
|
Localization.init(getApplicationContext());
|
||||||
|
|
||||||
StateSaver.init(this);
|
StateSaver.init(this);
|
||||||
initNotificationChannel();
|
initNotificationChannel();
|
||||||
|
|
||||||
|
ServiceHelper.initServices(this);
|
||||||
|
|
||||||
// Initialize image loader
|
// Initialize image loader
|
||||||
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).build();
|
ImageLoader.getInstance().init(getImageLoaderConfigurations(10, 50));
|
||||||
ImageLoader.getInstance().init(config);
|
|
||||||
|
|
||||||
configureRxJavaErrorHandler();
|
configureRxJavaErrorHandler();
|
||||||
|
|
||||||
|
// Check for new version
|
||||||
|
new CheckForNewAppVersionTask().execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Downloader getDownloader() {
|
||||||
|
return DownloaderImpl.init(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureRxJavaErrorHandler() {
|
private void configureRxJavaErrorHandler() {
|
||||||
// https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling
|
// https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling
|
||||||
RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
|
RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
|
||||||
@Override
|
@Override
|
||||||
public void accept(@NonNull Throwable throwable) throws Exception {
|
public void accept(@NonNull Throwable throwable) {
|
||||||
Log.e(TAG, "RxJavaPlugins.ErrorHandler called with -> : throwable = [" + throwable.getClass().getName() + "]");
|
Log.e(TAG, "RxJavaPlugins.ErrorHandler called with -> : " +
|
||||||
|
"throwable = [" + throwable.getClass().getName() + "]");
|
||||||
|
|
||||||
if (throwable instanceof UndeliverableException) {
|
if (throwable instanceof UndeliverableException) {
|
||||||
// As UndeliverableException is a wrapper, get the cause of it to get the "real" exception
|
// As UndeliverableException is a wrapper, get the cause of it to get the "real" exception
|
||||||
throwable = throwable.getCause();
|
throwable = throwable.getCause();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final List<Throwable> errors;
|
||||||
if (throwable instanceof CompositeException) {
|
if (throwable instanceof CompositeException) {
|
||||||
for (Throwable element : ((CompositeException) throwable).getExceptions()) {
|
errors = ((CompositeException) throwable).getExceptions();
|
||||||
if (checkThrowable(element)) return;
|
} else {
|
||||||
|
errors = Collections.singletonList(throwable);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (final Throwable error : errors) {
|
||||||
|
if (isThrowableIgnored(error)) return;
|
||||||
|
if (isThrowableCritical(error)) {
|
||||||
|
reportException(error);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (checkThrowable(throwable)) return;
|
// Out-of-lifecycle exceptions should only be reported if a debug user wishes so,
|
||||||
|
// When exception is not reported, log it
|
||||||
|
if (isDisposedRxExceptionsReported()) {
|
||||||
|
reportException(throwable);
|
||||||
|
} else {
|
||||||
|
Log.e(TAG, "RxJavaPlugin: Undeliverable Exception received: ", throwable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isThrowableIgnored(@NonNull final Throwable throwable) {
|
||||||
|
// Don't crash the application over a simple network problem
|
||||||
|
return ExtractorHelper.hasAssignableCauseThrowable(throwable,
|
||||||
|
IOException.class, SocketException.class, // network api cancellation
|
||||||
|
InterruptedException.class, InterruptedIOException.class); // blocking code disposed
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isThrowableCritical(@NonNull final Throwable throwable) {
|
||||||
|
// Though these exceptions cannot be ignored
|
||||||
|
return ExtractorHelper.hasAssignableCauseThrowable(throwable,
|
||||||
|
NullPointerException.class, IllegalArgumentException.class, // bug in app
|
||||||
|
OnErrorNotImplementedException.class, MissingBackpressureException.class,
|
||||||
|
IllegalStateException.class); // bug in operator
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reportException(@NonNull final Throwable throwable) {
|
||||||
// Throw uncaught exception that will trigger the report system
|
// Throw uncaught exception that will trigger the report system
|
||||||
Thread.currentThread().getUncaughtExceptionHandler()
|
Thread.currentThread().getUncaughtExceptionHandler()
|
||||||
.uncaughtException(Thread.currentThread(), throwable);
|
.uncaughtException(Thread.currentThread(), throwable);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkThrowable(@NonNull Throwable throwable) {
|
|
||||||
// Don't crash the application over a simple network problem
|
|
||||||
return ExtractorHelper.hasAssignableCauseThrowable(throwable,
|
|
||||||
IOException.class, SocketException.class, InterruptedException.class, InterruptedIOException.class);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ImageLoaderConfiguration getImageLoaderConfigurations(final int memoryCacheSizeMb,
|
||||||
|
final int diskCacheSizeMb) {
|
||||||
|
return new ImageLoaderConfiguration.Builder(this)
|
||||||
|
.memoryCache(new LRULimitedMemoryCache(memoryCacheSizeMb * 1024 * 1024))
|
||||||
|
.diskCacheSize(diskCacheSizeMb * 1024 * 1024)
|
||||||
|
.imageDownloader(new ImageDownloader(getApplicationContext()))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
private void initACRA() {
|
private void initACRA() {
|
||||||
try {
|
try {
|
||||||
@@ -126,7 +197,11 @@ public class App extends Application {
|
|||||||
ACRA.init(this, acraConfig);
|
ACRA.init(this, acraConfig);
|
||||||
} catch (ACRAConfigurationException ace) {
|
} catch (ACRAConfigurationException ace) {
|
||||||
ace.printStackTrace();
|
ace.printStackTrace();
|
||||||
ErrorActivity.reportError(this, ace, null, null, ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none",
|
ErrorActivity.reportError(this,
|
||||||
|
ace,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none",
|
||||||
"Could not initialize ACRA crash report", R.string.app_ui_crash));
|
"Could not initialize ACRA crash report", R.string.app_ui_crash));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,7 +221,51 @@ public class App extends Application {
|
|||||||
NotificationChannel mChannel = new NotificationChannel(id, name, importance);
|
NotificationChannel mChannel = new NotificationChannel(id, name, importance);
|
||||||
mChannel.setDescription(description);
|
mChannel.setDescription(description);
|
||||||
|
|
||||||
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
NotificationManager mNotificationManager =
|
||||||
|
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
mNotificationManager.createNotificationChannel(mChannel);
|
mNotificationManager.createNotificationChannel(mChannel);
|
||||||
|
|
||||||
|
setUpUpdateNotificationChannel(importance);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up notification channel for app update.
|
||||||
|
* @param importance
|
||||||
|
*/
|
||||||
|
@TargetApi(Build.VERSION_CODES.O)
|
||||||
|
private void setUpUpdateNotificationChannel(int importance) {
|
||||||
|
|
||||||
|
final String appUpdateId
|
||||||
|
= getString(R.string.app_update_notification_channel_id);
|
||||||
|
final CharSequence appUpdateName
|
||||||
|
= getString(R.string.app_update_notification_channel_name);
|
||||||
|
final String appUpdateDescription
|
||||||
|
= getString(R.string.app_update_notification_channel_description);
|
||||||
|
|
||||||
|
NotificationChannel appUpdateChannel
|
||||||
|
= new NotificationChannel(appUpdateId, appUpdateName, importance);
|
||||||
|
appUpdateChannel.setDescription(appUpdateDescription);
|
||||||
|
|
||||||
|
NotificationManager appUpdateNotificationManager
|
||||||
|
= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
|
appUpdateNotificationManager.createNotificationChannel(appUpdateChannel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static RefWatcher getRefWatcher(Context context) {
|
||||||
|
final App application = (App) context.getApplicationContext();
|
||||||
|
return application.refWatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RefWatcher installLeakCanary() {
|
||||||
|
return RefWatcher.DISABLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isDisposedRxExceptionsReported() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static App getApp() {
|
||||||
|
return app;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,28 +1,36 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.TypedArray;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.AttrRes;
|
import androidx.annotation.NonNull;
|
||||||
import android.support.annotation.NonNull;
|
import androidx.fragment.app.Fragment;
|
||||||
import android.support.v4.app.Fragment;
|
import androidx.fragment.app.FragmentManager;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||||
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
|
import com.squareup.leakcanary.RefWatcher;
|
||||||
|
|
||||||
import icepick.Icepick;
|
import icepick.Icepick;
|
||||||
|
import icepick.State;
|
||||||
|
|
||||||
public abstract class BaseFragment extends Fragment {
|
public abstract class BaseFragment extends Fragment {
|
||||||
protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
|
protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
|
||||||
protected boolean DEBUG = MainActivity.DEBUG;
|
protected final boolean DEBUG = MainActivity.DEBUG;
|
||||||
|
|
||||||
protected AppCompatActivity activity;
|
protected AppCompatActivity activity;
|
||||||
public static final ImageLoader imageLoader = ImageLoader.getInstance();
|
public static final ImageLoader imageLoader = ImageLoader.getInstance();
|
||||||
|
|
||||||
|
//These values are used for controlling framgents when they are part of the frontpage
|
||||||
|
@State
|
||||||
|
protected boolean useAsFrontPage = false;
|
||||||
|
protected boolean mIsVisibleToUser = false;
|
||||||
|
|
||||||
|
public void useAsFrontPage(boolean value) {
|
||||||
|
useAsFrontPage = value;
|
||||||
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
// Fragment's Lifecycle
|
// Fragment's Lifecycle
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
@@ -67,6 +75,20 @@ public abstract class BaseFragment extends Fragment {
|
|||||||
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
|
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
|
||||||
|
RefWatcher refWatcher = App.getRefWatcher(getActivity());
|
||||||
|
if (refWatcher != null) refWatcher.watch(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUserVisibleHint(boolean isVisibleToUser) {
|
||||||
|
super.setUserVisibleHint(isVisibleToUser);
|
||||||
|
mIsVisibleToUser = isVisibleToUser;
|
||||||
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
// Init
|
// Init
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
@@ -81,41 +103,18 @@ public abstract class BaseFragment extends Fragment {
|
|||||||
// Utils
|
// Utils
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
protected final int resolveResourceIdFromAttr(@AttrRes int attr) {
|
public void setTitle(String title) {
|
||||||
TypedArray a = activity.getTheme().obtainStyledAttributes(new int[]{attr});
|
if (DEBUG) Log.d(TAG, "setTitle() called with: title = [" + title + "]");
|
||||||
int attributeResourceId = a.getResourceId(0, 0);
|
if((!useAsFrontPage || mIsVisibleToUser)
|
||||||
a.recycle();
|
&& (activity != null && activity.getSupportActionBar() != null)) {
|
||||||
return attributeResourceId;
|
activity.getSupportActionBar().setDisplayShowTitleEnabled(true);
|
||||||
|
activity.getSupportActionBar().setTitle(title);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
protected FragmentManager getFM() {
|
||||||
// DisplayImageOptions default configurations
|
return getParentFragment() == null
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
? getFragmentManager()
|
||||||
|
: getParentFragment().getFragmentManager();
|
||||||
public static final DisplayImageOptions BASE_OPTIONS =
|
}
|
||||||
new DisplayImageOptions.Builder().cacheInMemory(true).build();
|
|
||||||
|
|
||||||
public static final DisplayImageOptions DISPLAY_AVATAR_OPTIONS =
|
|
||||||
new DisplayImageOptions.Builder()
|
|
||||||
.cloneFrom(BASE_OPTIONS)
|
|
||||||
.showImageOnLoading(R.drawable.buddy)
|
|
||||||
.showImageForEmptyUri(R.drawable.buddy)
|
|
||||||
.showImageOnFail(R.drawable.buddy)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
public static final DisplayImageOptions DISPLAY_THUMBNAIL_OPTIONS =
|
|
||||||
new DisplayImageOptions.Builder()
|
|
||||||
.cloneFrom(BASE_OPTIONS)
|
|
||||||
.displayer(new FadeInBitmapDisplayer(250))
|
|
||||||
.showImageForEmptyUri(R.drawable.dummy_thumbnail)
|
|
||||||
.showImageOnFail(R.drawable.dummy_thumbnail)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
public static final DisplayImageOptions DISPLAY_BANNER_OPTIONS =
|
|
||||||
new DisplayImageOptions.Builder()
|
|
||||||
.cloneFrom(BASE_OPTIONS)
|
|
||||||
.showImageOnLoading(R.drawable.channel_banner)
|
|
||||||
.showImageForEmptyUri(R.drawable.channel_banner)
|
|
||||||
.showImageOnFail(R.drawable.channel_banner)
|
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,238 @@
|
|||||||
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.pm.PackageInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.pm.Signature;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
import androidx.core.app.NotificationCompat;
|
||||||
|
import androidx.core.app.NotificationManagerCompat;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import org.schabi.newpipe.report.ErrorActivity;
|
||||||
|
import org.schabi.newpipe.report.UserAction;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.cert.CertificateEncodingException;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
|
import java.security.cert.CertificateFactory;
|
||||||
|
import java.security.cert.X509Certificate;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.Request;
|
||||||
|
import okhttp3.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AsyncTask to check if there is a newer version of the NewPipe github apk available or not.
|
||||||
|
* If there is a newer version we show a notification, informing the user. On tapping
|
||||||
|
* the notification, the user will be directed to the download link.
|
||||||
|
*/
|
||||||
|
public class CheckForNewAppVersionTask extends AsyncTask<Void, Void, String> {
|
||||||
|
|
||||||
|
private static final boolean DEBUG = MainActivity.DEBUG;
|
||||||
|
private static final String TAG = CheckForNewAppVersionTask.class.getSimpleName();
|
||||||
|
private static final Application app = App.getApp();
|
||||||
|
private static final String GITHUB_APK_SHA1 = "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15";
|
||||||
|
private static final String newPipeApiUrl = "https://newpipe.schabi.org/api/data.json";
|
||||||
|
private static final int timeoutPeriod = 30;
|
||||||
|
|
||||||
|
private SharedPreferences mPrefs;
|
||||||
|
private OkHttpClient client;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPreExecute() {
|
||||||
|
|
||||||
|
mPrefs = PreferenceManager.getDefaultSharedPreferences(app);
|
||||||
|
|
||||||
|
// Check if user has enabled/ disabled update checking
|
||||||
|
// and if the current apk is a github one or not.
|
||||||
|
if (!mPrefs.getBoolean(app.getString(R.string.update_app_key), true)
|
||||||
|
|| !isGithubApk()) {
|
||||||
|
this.cancel(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String doInBackground(Void... voids) {
|
||||||
|
|
||||||
|
if(isCancelled() || !isConnected()) return null;
|
||||||
|
|
||||||
|
// Make a network request to get latest NewPipe data.
|
||||||
|
if (client == null) {
|
||||||
|
|
||||||
|
client = new OkHttpClient
|
||||||
|
.Builder()
|
||||||
|
.readTimeout(timeoutPeriod, TimeUnit.SECONDS)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
Request request = new Request.Builder()
|
||||||
|
.url(newPipeApiUrl)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Response response = client.newCall(request).execute();
|
||||||
|
return response.body().string();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
// connectivity problems, do not alarm user and fail silently
|
||||||
|
if (DEBUG) Log.w(TAG, Log.getStackTraceString(ex));
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(String response) {
|
||||||
|
|
||||||
|
// Parse the json from the response.
|
||||||
|
if (response != null) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSONObject mainObject = new JSONObject(response);
|
||||||
|
JSONObject flavoursObject = mainObject.getJSONObject("flavors");
|
||||||
|
JSONObject githubObject = flavoursObject.getJSONObject("github");
|
||||||
|
JSONObject githubStableObject = githubObject.getJSONObject("stable");
|
||||||
|
|
||||||
|
String versionName = githubStableObject.getString("version");
|
||||||
|
String versionCode = githubStableObject.getString("version_code");
|
||||||
|
String apkLocationUrl = githubStableObject.getString("apk");
|
||||||
|
|
||||||
|
compareAppVersionAndShowNotification(versionName, apkLocationUrl, versionCode);
|
||||||
|
|
||||||
|
} catch (JSONException ex) {
|
||||||
|
// connectivity problems, do not alarm user and fail silently
|
||||||
|
if (DEBUG) Log.w(TAG, Log.getStackTraceString(ex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to compare the current and latest available app version.
|
||||||
|
* If a newer version is available, we show the update notification.
|
||||||
|
* @param versionName
|
||||||
|
* @param apkLocationUrl
|
||||||
|
*/
|
||||||
|
private void compareAppVersionAndShowNotification(String versionName,
|
||||||
|
String apkLocationUrl,
|
||||||
|
String versionCode) {
|
||||||
|
|
||||||
|
int NOTIFICATION_ID = 2000;
|
||||||
|
|
||||||
|
if (BuildConfig.VERSION_CODE < Integer.valueOf(versionCode)) {
|
||||||
|
|
||||||
|
// A pending intent to open the apk location url in the browser.
|
||||||
|
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl));
|
||||||
|
PendingIntent pendingIntent
|
||||||
|
= PendingIntent.getActivity(app, 0, intent, 0);
|
||||||
|
|
||||||
|
NotificationCompat.Builder notificationBuilder = new NotificationCompat
|
||||||
|
.Builder(app, app.getString(R.string.app_update_notification_channel_id))
|
||||||
|
.setSmallIcon(R.drawable.ic_newpipe_update)
|
||||||
|
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||||
|
.setContentIntent(pendingIntent)
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.setContentTitle(app.getString(R.string.app_update_notification_content_title))
|
||||||
|
.setContentText(app.getString(R.string.app_update_notification_content_text)
|
||||||
|
+ " " + versionName);
|
||||||
|
|
||||||
|
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(app);
|
||||||
|
notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to get the apk's SHA1 key.
|
||||||
|
* https://stackoverflow.com/questions/9293019/get-certificate-fingerprint-from-android-app#22506133
|
||||||
|
*/
|
||||||
|
private static String getCertificateSHA1Fingerprint() {
|
||||||
|
|
||||||
|
PackageManager pm = app.getPackageManager();
|
||||||
|
String packageName = app.getPackageName();
|
||||||
|
int flags = PackageManager.GET_SIGNATURES;
|
||||||
|
PackageInfo packageInfo = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
packageInfo = pm.getPackageInfo(packageName, flags);
|
||||||
|
} catch (PackageManager.NameNotFoundException ex) {
|
||||||
|
ErrorActivity.reportError(app, ex, null, null,
|
||||||
|
ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none",
|
||||||
|
"Could not find package info", R.string.app_ui_crash));
|
||||||
|
}
|
||||||
|
|
||||||
|
Signature[] signatures = packageInfo.signatures;
|
||||||
|
byte[] cert = signatures[0].toByteArray();
|
||||||
|
InputStream input = new ByteArrayInputStream(cert);
|
||||||
|
|
||||||
|
CertificateFactory cf = null;
|
||||||
|
X509Certificate c = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
cf = CertificateFactory.getInstance("X509");
|
||||||
|
c = (X509Certificate) cf.generateCertificate(input);
|
||||||
|
} catch (CertificateException ex) {
|
||||||
|
ErrorActivity.reportError(app, ex, null, null,
|
||||||
|
ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none",
|
||||||
|
"Certificate error", R.string.app_ui_crash));
|
||||||
|
}
|
||||||
|
|
||||||
|
String hexString = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
MessageDigest md = MessageDigest.getInstance("SHA1");
|
||||||
|
byte[] publicKey = md.digest(c.getEncoded());
|
||||||
|
hexString = byte2HexFormatted(publicKey);
|
||||||
|
} catch (NoSuchAlgorithmException ex1) {
|
||||||
|
ErrorActivity.reportError(app, ex1, null, null,
|
||||||
|
ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none",
|
||||||
|
"Could not retrieve SHA1 key", R.string.app_ui_crash));
|
||||||
|
} catch (CertificateEncodingException ex2) {
|
||||||
|
ErrorActivity.reportError(app, ex2, null, null,
|
||||||
|
ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none",
|
||||||
|
"Could not retrieve SHA1 key", R.string.app_ui_crash));
|
||||||
|
}
|
||||||
|
|
||||||
|
return hexString;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String byte2HexFormatted(byte[] arr) {
|
||||||
|
|
||||||
|
StringBuilder str = new StringBuilder(arr.length * 2);
|
||||||
|
|
||||||
|
for (int i = 0; i < arr.length; i++) {
|
||||||
|
String h = Integer.toHexString(arr[i]);
|
||||||
|
int l = h.length();
|
||||||
|
if (l == 1) h = "0" + h;
|
||||||
|
if (l > 2) h = h.substring(l - 2, l);
|
||||||
|
str.append(h.toUpperCase());
|
||||||
|
if (i < (arr.length - 1)) str.append(':');
|
||||||
|
}
|
||||||
|
return str.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isGithubApk() {
|
||||||
|
|
||||||
|
return getCertificateSHA1Fingerprint().equals(GITHUB_APK_SHA1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isConnected() {
|
||||||
|
|
||||||
|
ConnectivityManager cm =
|
||||||
|
(ConnectivityManager) app.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
return cm.getActiveNetworkInfo() != null
|
||||||
|
&& cm.getActiveNetworkInfo().isConnected();
|
||||||
|
}
|
||||||
|
}
|
@@ -1,167 +0,0 @@
|
|||||||
package org.schabi.newpipe;
|
|
||||||
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
|
|
||||||
import org.schabi.newpipe.util.ExtractorHelper;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.InterruptedIOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import javax.net.ssl.HttpsURLConnection;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Created by Christian Schabesberger on 28.01.16.
|
|
||||||
*
|
|
||||||
* Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>
|
|
||||||
* Downloader.java is part of NewPipe.
|
|
||||||
*
|
|
||||||
* NewPipe is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* NewPipe is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class Downloader implements org.schabi.newpipe.extractor.Downloader {
|
|
||||||
|
|
||||||
public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0";
|
|
||||||
private static String mCookies = "";
|
|
||||||
|
|
||||||
private static Downloader instance = null;
|
|
||||||
|
|
||||||
private Downloader() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Downloader getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
synchronized (Downloader.class) {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new Downloader();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static synchronized void setCookies(String cookies) {
|
|
||||||
Downloader.mCookies = cookies;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static synchronized String getCookies() {
|
|
||||||
return Downloader.mCookies;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Download the text file at the supplied URL as in download(String),
|
|
||||||
* but set the HTTP header field "Accept-Language" to the supplied string.
|
|
||||||
*
|
|
||||||
* @param siteUrl the URL of the text file to return the contents of
|
|
||||||
* @param language the language (usually a 2-character code) to set as the preferred language
|
|
||||||
* @return the contents of the specified text file
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String download(String siteUrl, String language) throws IOException, ReCaptchaException {
|
|
||||||
Map<String, String> requestProperties = new HashMap<>();
|
|
||||||
requestProperties.put("Accept-Language", language);
|
|
||||||
return download(siteUrl, requestProperties);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Download the text file at the supplied URL as in download(String),
|
|
||||||
* but set the HTTP headers included in the customProperties map.
|
|
||||||
*
|
|
||||||
* @param siteUrl the URL of the text file to return the contents of
|
|
||||||
* @param customProperties set request header properties
|
|
||||||
* @return the contents of the specified text file
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String download(String siteUrl, Map<String, String> customProperties) throws IOException, ReCaptchaException {
|
|
||||||
URL url = new URL(siteUrl);
|
|
||||||
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
|
|
||||||
Iterator it = customProperties.entrySet().iterator();
|
|
||||||
while (it.hasNext()) {
|
|
||||||
Map.Entry pair = (Map.Entry) it.next();
|
|
||||||
con.setRequestProperty((String) pair.getKey(), (String) pair.getValue());
|
|
||||||
}
|
|
||||||
return dl(con);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Download (via HTTP) the text file located at the supplied URL, and return its contents.
|
|
||||||
* Primarily intended for downloading web pages.
|
|
||||||
*
|
|
||||||
* @param siteUrl the URL of the text file to download
|
|
||||||
* @return the contents of the specified text file
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String download(String siteUrl) throws IOException, ReCaptchaException {
|
|
||||||
URL url = new URL(siteUrl);
|
|
||||||
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
|
|
||||||
//HttpsURLConnection con = NetCipher.getHttpsURLConnection(url);
|
|
||||||
return dl(con);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Common functionality between download(String url) and download(String url, String language)
|
|
||||||
*/
|
|
||||||
private static String dl(HttpsURLConnection con) throws IOException, ReCaptchaException {
|
|
||||||
StringBuilder response = new StringBuilder();
|
|
||||||
BufferedReader in = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
con.setReadTimeout(30 * 1000);// 30s
|
|
||||||
con.setRequestMethod("GET");
|
|
||||||
con.setRequestProperty("User-Agent", USER_AGENT);
|
|
||||||
|
|
||||||
if (getCookies().length() > 0) {
|
|
||||||
con.setRequestProperty("Cookie", getCookies());
|
|
||||||
}
|
|
||||||
|
|
||||||
in = new BufferedReader(new InputStreamReader(con.getInputStream()));
|
|
||||||
|
|
||||||
String inputLine;
|
|
||||||
while ((inputLine = in.readLine()) != null) {
|
|
||||||
response.append(inputLine);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.e("Downloader", "dl() ----- Exception thrown → " + e.getClass().getName());
|
|
||||||
|
|
||||||
if (ExtractorHelper.isInterruptedCaused(e)) {
|
|
||||||
throw new InterruptedIOException(e.getMessage());
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* HTTP 429 == Too Many Request
|
|
||||||
* Receive from Youtube.com = ReCaptcha challenge request
|
|
||||||
* See : https://github.com/rg3/youtube-dl/issues/5138
|
|
||||||
*/
|
|
||||||
if (con.getResponseCode() == 429) {
|
|
||||||
throw new ReCaptchaException("reCaptcha Challenge requested");
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new IOException(con.getResponseCode() + " " + con.getResponseMessage(), e);
|
|
||||||
} finally {
|
|
||||||
if (in != null) {
|
|
||||||
in.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return response.toString();
|
|
||||||
}
|
|
||||||
}
|
|
220
app/src/main/java/org/schabi/newpipe/DownloaderImpl.java
Normal file
220
app/src/main/java/org/schabi/newpipe/DownloaderImpl.java
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
|
import android.os.Build;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.extractor.downloader.Downloader;
|
||||||
|
import org.schabi.newpipe.extractor.downloader.Request;
|
||||||
|
import org.schabi.newpipe.extractor.downloader.Response;
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
|
||||||
|
import org.schabi.newpipe.util.TLSSocketFactoryCompat;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.security.KeyManagementException;
|
||||||
|
import java.security.KeyStore;
|
||||||
|
import java.security.KeyStoreException;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.net.ssl.SSLSocketFactory;
|
||||||
|
import javax.net.ssl.TrustManager;
|
||||||
|
import javax.net.ssl.TrustManagerFactory;
|
||||||
|
import javax.net.ssl.X509TrustManager;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import okhttp3.CipherSuite;
|
||||||
|
import okhttp3.ConnectionSpec;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.RequestBody;
|
||||||
|
import okhttp3.ResponseBody;
|
||||||
|
|
||||||
|
import static org.schabi.newpipe.MainActivity.DEBUG;
|
||||||
|
|
||||||
|
public class DownloaderImpl extends Downloader {
|
||||||
|
public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0";
|
||||||
|
|
||||||
|
private static DownloaderImpl instance;
|
||||||
|
private String mCookies;
|
||||||
|
private OkHttpClient client;
|
||||||
|
|
||||||
|
private DownloaderImpl(OkHttpClient.Builder builder) {
|
||||||
|
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
|
||||||
|
enableModernTLS(builder);
|
||||||
|
}
|
||||||
|
this.client = builder
|
||||||
|
.readTimeout(30, TimeUnit.SECONDS)
|
||||||
|
//.cache(new Cache(new File(context.getExternalCacheDir(), "okhttp"), 16 * 1024 * 1024))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It's recommended to call exactly once in the entire lifetime of the application.
|
||||||
|
*
|
||||||
|
* @param builder if null, default builder will be used
|
||||||
|
*/
|
||||||
|
public static DownloaderImpl init(@Nullable OkHttpClient.Builder builder) {
|
||||||
|
return instance = new DownloaderImpl(builder != null ? builder : new OkHttpClient.Builder());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DownloaderImpl getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCookies() {
|
||||||
|
return mCookies;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCookies(String cookies) {
|
||||||
|
mCookies = cookies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the size of the content that the url is pointing by firing a HEAD request.
|
||||||
|
*
|
||||||
|
* @param url an url pointing to the content
|
||||||
|
* @return the size of the content, in bytes
|
||||||
|
*/
|
||||||
|
public long getContentLength(String url) throws IOException {
|
||||||
|
try {
|
||||||
|
final Response response = head(url);
|
||||||
|
return Long.parseLong(response.getHeader("Content-Length"));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new IOException("Invalid content length", e);
|
||||||
|
} catch (ReCaptchaException e) {
|
||||||
|
throw new IOException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputStream stream(String siteUrl) throws IOException {
|
||||||
|
try {
|
||||||
|
final okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder()
|
||||||
|
.method("GET", null).url(siteUrl)
|
||||||
|
.addHeader("User-Agent", USER_AGENT);
|
||||||
|
|
||||||
|
if (!TextUtils.isEmpty(mCookies)) {
|
||||||
|
requestBuilder.addHeader("Cookie", mCookies);
|
||||||
|
}
|
||||||
|
|
||||||
|
final okhttp3.Request request = requestBuilder.build();
|
||||||
|
final okhttp3.Response response = client.newCall(request).execute();
|
||||||
|
final ResponseBody body = response.body();
|
||||||
|
|
||||||
|
if (response.code() == 429) {
|
||||||
|
throw new ReCaptchaException("reCaptcha Challenge requested", siteUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (body == null) {
|
||||||
|
response.close();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return body.byteStream();
|
||||||
|
} catch (ReCaptchaException e) {
|
||||||
|
throw new IOException(e.getMessage(), e.getCause());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Response execute(@NonNull Request request) throws IOException, ReCaptchaException {
|
||||||
|
final String httpMethod = request.httpMethod();
|
||||||
|
final String url = request.url();
|
||||||
|
final Map<String, List<String>> headers = request.headers();
|
||||||
|
final byte[] dataToSend = request.dataToSend();
|
||||||
|
|
||||||
|
RequestBody requestBody = null;
|
||||||
|
if (dataToSend != null) {
|
||||||
|
requestBody = RequestBody.create(null, dataToSend);
|
||||||
|
}
|
||||||
|
|
||||||
|
final okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder()
|
||||||
|
.method(httpMethod, requestBody).url(url)
|
||||||
|
.addHeader("User-Agent", USER_AGENT);
|
||||||
|
|
||||||
|
if (!TextUtils.isEmpty(mCookies)) {
|
||||||
|
requestBuilder.addHeader("Cookie", mCookies);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, List<String>> pair : headers.entrySet()) {
|
||||||
|
final String headerName = pair.getKey();
|
||||||
|
final List<String> headerValueList = pair.getValue();
|
||||||
|
|
||||||
|
if (headerValueList.size() > 1) {
|
||||||
|
requestBuilder.removeHeader(headerName);
|
||||||
|
for (String headerValue : headerValueList) {
|
||||||
|
requestBuilder.addHeader(headerName, headerValue);
|
||||||
|
}
|
||||||
|
} else if (headerValueList.size() == 1) {
|
||||||
|
requestBuilder.header(headerName, headerValueList.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
final okhttp3.Response response = client.newCall(requestBuilder.build()).execute();
|
||||||
|
|
||||||
|
if (response.code() == 429) {
|
||||||
|
response.close();
|
||||||
|
|
||||||
|
throw new ReCaptchaException("reCaptcha Challenge requested", url);
|
||||||
|
}
|
||||||
|
|
||||||
|
final ResponseBody body = response.body();
|
||||||
|
String responseBodyToReturn = null;
|
||||||
|
|
||||||
|
if (body != null) {
|
||||||
|
responseBodyToReturn = body.string();
|
||||||
|
}
|
||||||
|
|
||||||
|
final String latestUrl = response.request().url().toString();
|
||||||
|
return new Response(response.code(), response.message(), response.headers().toMultimap(), responseBodyToReturn, latestUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable TLS 1.2 and 1.1 on Android Kitkat. This function is mostly taken from the documentation of
|
||||||
|
* OkHttpClient.Builder.sslSocketFactory(_,_)
|
||||||
|
* <p>
|
||||||
|
* If there is an error, the function will safely fall back to doing nothing and printing the error to the console.
|
||||||
|
*
|
||||||
|
* @param builder The HTTPClient Builder on which TLS is enabled on (will be modified in-place)
|
||||||
|
*/
|
||||||
|
private static void enableModernTLS(OkHttpClient.Builder builder) {
|
||||||
|
try {
|
||||||
|
// get the default TrustManager
|
||||||
|
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
|
||||||
|
TrustManagerFactory.getDefaultAlgorithm());
|
||||||
|
trustManagerFactory.init((KeyStore) null);
|
||||||
|
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
|
||||||
|
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
|
||||||
|
throw new IllegalStateException("Unexpected default trust managers:"
|
||||||
|
+ Arrays.toString(trustManagers));
|
||||||
|
}
|
||||||
|
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
|
||||||
|
|
||||||
|
// insert our own TLSSocketFactory
|
||||||
|
SSLSocketFactory sslSocketFactory = TLSSocketFactoryCompat.getInstance();
|
||||||
|
|
||||||
|
builder.sslSocketFactory(sslSocketFactory, trustManager);
|
||||||
|
|
||||||
|
// This will try to enable all modern CipherSuites(+2 more) that are supported on the device.
|
||||||
|
// Necessary because some servers (e.g. Framatube.org) don't support the old cipher suites.
|
||||||
|
// https://github.com/square/okhttp/issues/4053#issuecomment-402579554
|
||||||
|
List<CipherSuite> cipherSuites = new ArrayList<>();
|
||||||
|
cipherSuites.addAll(ConnectionSpec.MODERN_TLS.cipherSuites());
|
||||||
|
cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA);
|
||||||
|
cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA);
|
||||||
|
ConnectionSpec legacyTLS = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
|
||||||
|
.cipherSuites(cipherSuites.toArray(new CipherSuite[0]))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
builder.connectionSpecs(Arrays.asList(legacyTLS, ConnectionSpec.CLEARTEXT));
|
||||||
|
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
|
||||||
|
if (DEBUG) e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
46
app/src/main/java/org/schabi/newpipe/ImageDownloader.java
Normal file
46
app/src/main/java/org/schabi/newpipe/ImageDownloader.java
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public class ImageDownloader extends BaseImageDownloader {
|
||||||
|
private final Resources resources;
|
||||||
|
private final SharedPreferences preferences;
|
||||||
|
private final String downloadThumbnailKey;
|
||||||
|
|
||||||
|
public ImageDownloader(Context context) {
|
||||||
|
super(context);
|
||||||
|
this.resources = context.getResources();
|
||||||
|
this.preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
this.downloadThumbnailKey = context.getString(R.string.download_thumbnail_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isDownloadingThumbnail() {
|
||||||
|
return preferences.getBoolean(downloadThumbnailKey, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("ResourceType")
|
||||||
|
@Override
|
||||||
|
public InputStream getStream(String imageUri, Object extra) throws IOException {
|
||||||
|
if (isDownloadingThumbnail()) {
|
||||||
|
return super.getStream(imageUri, extra);
|
||||||
|
} else {
|
||||||
|
return resources.openRawResource(R.drawable.dummy_thumbnail_dark);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {
|
||||||
|
final DownloaderImpl downloader = (DownloaderImpl) NewPipe.getDownloader();
|
||||||
|
return downloader.stream(imageUri);
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@@ -1,31 +1,42 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.arch.persistence.room.Room;
|
import androidx.room.Room;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import org.schabi.newpipe.database.AppDatabase;
|
import org.schabi.newpipe.database.AppDatabase;
|
||||||
|
|
||||||
import static org.schabi.newpipe.database.AppDatabase.DATABASE_NAME;
|
import static org.schabi.newpipe.database.AppDatabase.DATABASE_NAME;
|
||||||
|
import static org.schabi.newpipe.database.Migrations.MIGRATION_11_12;
|
||||||
|
|
||||||
public final class NewPipeDatabase {
|
public final class NewPipeDatabase {
|
||||||
|
|
||||||
private static AppDatabase databaseInstance;
|
private static volatile AppDatabase databaseInstance;
|
||||||
|
|
||||||
private NewPipeDatabase() {
|
private NewPipeDatabase() {
|
||||||
//no instance
|
//no instance
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void init(Context context) {
|
private static AppDatabase getDatabase(Context context) {
|
||||||
databaseInstance = Room.databaseBuilder(context.getApplicationContext(),
|
return Room
|
||||||
AppDatabase.class, DATABASE_NAME
|
.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME)
|
||||||
).build();
|
.addMigrations(MIGRATION_11_12)
|
||||||
|
.fallbackToDestructiveMigration()
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
public static AppDatabase getInstance() {
|
public static AppDatabase getInstance(@NonNull Context context) {
|
||||||
if (databaseInstance == null) throw new RuntimeException("Database not initialized");
|
AppDatabase result = databaseInstance;
|
||||||
|
if (result == null) {
|
||||||
|
synchronized (NewPipeDatabase.class) {
|
||||||
|
result = databaseInstance;
|
||||||
|
if (result == null) {
|
||||||
|
databaseInstance = (result = getDatabase(context));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return databaseInstance;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,21 +1,25 @@
|
|||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.NavUtils;
|
import androidx.core.app.NavUtils;
|
||||||
import android.support.v7.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import android.support.v7.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.webkit.CookieManager;
|
import android.webkit.CookieManager;
|
||||||
import android.webkit.ValueCallback;
|
|
||||||
import android.webkit.WebSettings;
|
import android.webkit.WebSettings;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.webkit.WebViewClient;
|
import android.webkit.WebViewClient;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.util.ThemeHelper;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Created by beneth <bmauduit@beneth.fr> on 06.12.16.
|
* Created by beneth <bmauduit@beneth.fr> on 06.12.16.
|
||||||
*
|
*
|
||||||
@@ -37,121 +41,130 @@ import android.webkit.WebViewClient;
|
|||||||
*/
|
*/
|
||||||
public class ReCaptchaActivity extends AppCompatActivity {
|
public class ReCaptchaActivity extends AppCompatActivity {
|
||||||
public static final int RECAPTCHA_REQUEST = 10;
|
public static final int RECAPTCHA_REQUEST = 10;
|
||||||
|
public static final String RECAPTCHA_URL_EXTRA = "recaptcha_url_extra";
|
||||||
public static final String TAG = ReCaptchaActivity.class.toString();
|
public static final String TAG = ReCaptchaActivity.class.toString();
|
||||||
public static final String YT_URL = "https://www.youtube.com";
|
public static final String YT_URL = "https://www.youtube.com";
|
||||||
|
|
||||||
|
private WebView webView;
|
||||||
|
private String foundCookies = "";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
ThemeHelper.setTheme(this);
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_recaptcha);
|
setContentView(R.layout.activity_recaptcha);
|
||||||
|
|
||||||
// Set return to Cancel by default
|
|
||||||
setResult(RESULT_CANCELED);
|
|
||||||
|
|
||||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
String url = getIntent().getStringExtra(RECAPTCHA_URL_EXTRA);
|
||||||
if (actionBar != null) {
|
if (url == null || url.isEmpty()) {
|
||||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
url = YT_URL;
|
||||||
actionBar.setTitle(R.string.reCaptcha_title);
|
|
||||||
actionBar.setDisplayShowTitleEnabled(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WebView myWebView = findViewById(R.id.reCaptchaWebView);
|
// set return to Cancel by default
|
||||||
|
setResult(RESULT_CANCELED);
|
||||||
|
|
||||||
// Enable Javascript
|
|
||||||
WebSettings webSettings = myWebView.getSettings();
|
webView = findViewById(R.id.reCaptchaWebView);
|
||||||
|
|
||||||
|
// enable Javascript
|
||||||
|
WebSettings webSettings = webView.getSettings();
|
||||||
webSettings.setJavaScriptEnabled(true);
|
webSettings.setJavaScriptEnabled(true);
|
||||||
|
|
||||||
ReCaptchaWebViewClient webClient = new ReCaptchaWebViewClient(this);
|
webView.setWebViewClient(new WebViewClient() {
|
||||||
myWebView.setWebViewClient(webClient);
|
@Override
|
||||||
|
public void onPageFinished(WebView view, String url) {
|
||||||
|
super.onPageFinished(view, url);
|
||||||
|
handleCookies(url);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Cleaning cache, history and cookies from webView
|
// cleaning cache, history and cookies from webView
|
||||||
myWebView.clearCache(true);
|
webView.clearCache(true);
|
||||||
myWebView.clearHistory();
|
webView.clearHistory();
|
||||||
android.webkit.CookieManager cookieManager = CookieManager.getInstance();
|
android.webkit.CookieManager cookieManager = CookieManager.getInstance();
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
cookieManager.removeAllCookies(new ValueCallback<Boolean>() {
|
cookieManager.removeAllCookies(aBoolean -> {});
|
||||||
@Override
|
|
||||||
public void onReceiveValue(Boolean aBoolean) {}
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
cookieManager.removeAllCookie();
|
cookieManager.removeAllCookie();
|
||||||
}
|
}
|
||||||
|
|
||||||
myWebView.loadUrl(YT_URL);
|
webView.loadUrl(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ReCaptchaWebViewClient extends WebViewClient {
|
@Override
|
||||||
private Activity context;
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
private String mCookies;
|
getMenuInflater().inflate(R.menu.menu_recaptcha, menu);
|
||||||
|
|
||||||
ReCaptchaWebViewClient(Activity ctx) {
|
ActionBar actionBar = getSupportActionBar();
|
||||||
context = ctx;
|
if (actionBar != null) {
|
||||||
|
actionBar.setDisplayHomeAsUpEnabled(false);
|
||||||
|
actionBar.setTitle(R.string.title_activity_recaptcha);
|
||||||
|
actionBar.setSubtitle(R.string.subtitle_activity_recaptcha);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
return true;
|
||||||
public void onPageStarted(WebView view, String url, Bitmap favicon) {
|
}
|
||||||
// TODO: Start Loader
|
|
||||||
super.onPageStarted(view, url, favicon);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageFinished(WebView view, String url) {
|
public void onBackPressed() {
|
||||||
String cookies = CookieManager.getInstance().getCookie(url);
|
saveCookiesAndFinish();
|
||||||
|
|
||||||
// TODO: Stop Loader
|
|
||||||
|
|
||||||
// find cookies : s_gl & goojf and Add cookies to Downloader
|
|
||||||
if (find_access_cookies(cookies)) {
|
|
||||||
// Give cookies to Downloader class
|
|
||||||
Downloader.setCookies(mCookies);
|
|
||||||
|
|
||||||
// Closing activity and return to parent
|
|
||||||
setResult(RESULT_OK);
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean find_access_cookies(String cookies) {
|
|
||||||
boolean ret = false;
|
|
||||||
String c_s_gl = "";
|
|
||||||
String c_goojf = "";
|
|
||||||
|
|
||||||
String[] parts = cookies.split("; ");
|
|
||||||
for (String part : parts) {
|
|
||||||
if (part.trim().startsWith("s_gl")) {
|
|
||||||
c_s_gl = part.trim();
|
|
||||||
}
|
|
||||||
if (part.trim().startsWith("goojf")) {
|
|
||||||
c_goojf = part.trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (c_s_gl.length() > 0 && c_goojf.length() > 0) {
|
|
||||||
ret = true;
|
|
||||||
//mCookies = c_s_gl + "; " + c_goojf;
|
|
||||||
// Youtube seems to also need the other cookies:
|
|
||||||
mCookies = cookies;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
int id = item.getItemId();
|
int id = item.getItemId();
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case android.R.id.home: {
|
case R.id.menu_item_done:
|
||||||
Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class);
|
saveCookiesAndFinish();
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
|
||||||
NavUtils.navigateUpTo(this, intent);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void saveCookiesAndFinish() {
|
||||||
|
handleCookies(webView.getUrl()); // try to get cookies of unclosed page
|
||||||
|
if (!foundCookies.isEmpty()) {
|
||||||
|
// give cookies to Downloader class
|
||||||
|
DownloaderImpl.getInstance().setCookies(foundCookies);
|
||||||
|
setResult(RESULT_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class);
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
|
NavUtils.navigateUpTo(this, intent);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void handleCookies(String url) {
|
||||||
|
String cookies = CookieManager.getInstance().getCookie(url);
|
||||||
|
if (MainActivity.DEBUG) Log.d(TAG, "handleCookies: url=" + url + "; cookies=" + (cookies == null ? "null" : cookies));
|
||||||
|
if (cookies == null) return;
|
||||||
|
|
||||||
|
addYoutubeCookies(cookies);
|
||||||
|
// add other methods to extract cookies here
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addYoutubeCookies(@NonNull String cookies) {
|
||||||
|
if (cookies.contains("s_gl=") || cookies.contains("goojf=") || cookies.contains("VISITOR_INFO1_LIVE=")) {
|
||||||
|
// youtube seems to also need the other cookies:
|
||||||
|
addCookie(cookies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addCookie(String cookie) {
|
||||||
|
if (foundCookies.contains(cookie)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foundCookies.isEmpty() || foundCookies.endsWith("; ")) {
|
||||||
|
foundCookies += cookie;
|
||||||
|
} else if (foundCookies.endsWith(";")) {
|
||||||
|
foundCookies += " " + cookie;
|
||||||
|
} else {
|
||||||
|
foundCookies += "; " + cookie;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user