From 6fef9834fe9bb1a2d7eb8f3ca04a6714f7b301ab Mon Sep 17 00:00:00 2001 From: DiMartinoX Date: Fri, 9 Jan 2015 14:11:21 +0300 Subject: [PATCH] lol why? --- .idea/encodings.xml | 5 + .idea/misc.xml | 5 + .idea/modules.xml | 9 + .idea/plugin.video.torrenter.iml | 9 + .idea/scopes/scope_settings.xml | 5 + .idea/vcs.xml | 7 + .idea/workspace.xml | 380 ++ AceStream.py | 152 + AceStream.pyo | Bin 0 -> 6355 bytes BeautifulSoup.py | 2049 +++++++ BeautifulSoup.pyc | Bin 0 -> 73736 bytes BeautifulSoup.pyo | Bin 0 -> 73877 bytes Content.py | 233 + Content.pyc | Bin 0 -> 8602 bytes Content.pyo | Bin 0 -> 8616 bytes Core.py | 1579 ++++++ Core.pyo | Bin 0 -> 56233 bytes Downloader.py | 132 + Downloader.pyo | Bin 0 -> 7865 bytes Libtorrent.py | 399 ++ Libtorrent.pyo | Bin 0 -> 15255 bytes Localization.py | 207 + Localization.pyc | Bin 0 -> 12699 bytes Localization.pyo | Bin 0 -> 13178 bytes Player.py | 377 ++ Player.pyo | Bin 0 -> 15184 bytes Proxier.py | 80 + README.txt | 57 + Rates.py | 66 + SearcherABC.py | 216 + SearcherABC.pyo | Bin 0 -> 9489 bytes addon.xml | 24 + cal.py | 12 + changelog.txt | 40 + controlcenter.py | 385 ++ default.py | 40 + functions.py | 1586 ++++++ functions.pyc | Bin 0 -> 54700 bytes functions.pyo | Bin 0 -> 63609 bytes icon.png | Bin 0 -> 51356 bytes icons/clear.png | Bin 0 -> 24655 bytes icons/fav.png | Bin 0 -> 7171 bytes icons/history2.png | Bin 0 -> 49057 bytes icons/list.png | Bin 0 -> 243984 bytes icons/magnet.png | Bin 0 -> 43437 bytes icons/media.png | Bin 0 -> 43787 bytes icons/search.png | Bin 0 -> 37615 bytes icons/settings.png | Bin 0 -> 40455 bytes icons/torrent-client.png | Bin 0 -> 9855 bytes icons/torrentPlayer.png | Bin 0 -> 33233 bytes icons/unfav.png | Bin 0 -> 5256 bytes icons/video.png | Bin 0 -> 79851 bytes resources/__init__.py | 0 resources/__init__.pyc | Bin 0 -> 174 bytes resources/__init__.pyo | Bin 0 -> 174 bytes resources/contenters/CXZ.py | 191 + resources/contenters/CXZ.pyo | Bin 0 -> 8407 bytes resources/contenters/EZTV.py | 91 + resources/contenters/EZTV.pyo | Bin 0 -> 3998 bytes resources/contenters/FastTorrent.py | 146 + resources/contenters/FastTorrent.pyo | Bin 0 -> 5992 bytes resources/contenters/IMDB.py | 248 + resources/contenters/IMDB.pyo | Bin 0 -> 10241 bytes resources/contenters/KinoPoisk.py | 310 + resources/contenters/KinoPoisk.pyo | Bin 0 -> 10960 bytes resources/contenters/RiperAM.py | 110 + resources/contenters/RiperAM.pyo | Bin 0 -> 4736 bytes resources/images/black.png | Bin 0 -> 95 bytes resources/language/English/strings.xml | 49 + resources/language/Russian/strings.xml | 50 + resources/pyxbmct/__init__.py | 0 resources/pyxbmct/__init__.pyo | Bin 0 -> 182 bytes resources/pyxbmct/addonwindow.py | 774 +++ resources/pyxbmct/addonwindow.pyo | Bin 0 -> 36263 bytes .../default/AddonWindow/ContentPanel.png | Bin 0 -> 53334 bytes .../AddonWindow/DialogCloseButton-focus.png | Bin 0 -> 5216 bytes .../default/AddonWindow/DialogCloseButton.png | Bin 0 -> 4522 bytes .../default/AddonWindow/SKINDEFAULT.jpg | Bin 0 -> 125107 bytes .../default/AddonWindow/dialogheader.png | Bin 0 -> 4875 bytes .../textures/default/Button/KeyboardKey.png | Bin 0 -> 5929 bytes .../textures/default/Button/KeyboardKeyNF.png | Bin 0 -> 2968 bytes .../textures/default/Edit/black-back2.png | Bin 0 -> 23797 bytes .../textures/default/Edit/button-focus.png | Bin 0 -> 5605 bytes .../textures/default/List/MenuItemFO.png | Bin 0 -> 24951 bytes .../textures/default/List/MenuItemNF.png | Bin 0 -> 3173 bytes .../default/RadioButton/MenuItemFO.png | Bin 0 -> 24951 bytes .../default/RadioButton/MenuItemNF.png | Bin 0 -> 3173 bytes .../default/RadioButton/radiobutton-focus.png | Bin 0 -> 5190 bytes .../RadioButton/radiobutton-nofocus.png | Bin 0 -> 4442 bytes .../textures/default/Slider/osd_slider_bg.png | Bin 0 -> 3012 bytes .../default/Slider/osd_slider_bg_2.png | Bin 0 -> 2945 bytes .../default/Slider/osd_slider_nib.png | Bin 0 -> 2803 bytes .../default/Slider/osd_slider_nibNF.png | Bin 0 -> 2812 bytes resources/scrapers/__init__.py | 0 resources/scrapers/__init__.pyc | Bin 0 -> 183 bytes resources/scrapers/__init__.pyo | Bin 0 -> 183 bytes resources/scrapers/cache.py | 164 + resources/scrapers/cache.pyo | Bin 0 -> 6217 bytes .../scrapers/fuzzywuzzy/StringMatcher.py | 78 + .../scrapers/fuzzywuzzy/StringMatcher.pyc | Bin 0 -> 4423 bytes .../scrapers/fuzzywuzzy/StringMatcher.pyo | Bin 0 -> 4423 bytes resources/scrapers/fuzzywuzzy/__init__.py | 2 + resources/scrapers/fuzzywuzzy/__init__.pyc | Bin 0 -> 226 bytes resources/scrapers/fuzzywuzzy/__init__.pyo | Bin 0 -> 226 bytes resources/scrapers/fuzzywuzzy/fuzz.py | 270 + resources/scrapers/fuzzywuzzy/fuzz.pyc | Bin 0 -> 7514 bytes resources/scrapers/fuzzywuzzy/fuzz.pyo | Bin 0 -> 7514 bytes resources/scrapers/fuzzywuzzy/process.py | 135 + .../scrapers/fuzzywuzzy/string_processing.py | 41 + .../scrapers/fuzzywuzzy/string_processing.pyc | Bin 0 -> 2249 bytes .../scrapers/fuzzywuzzy/string_processing.pyo | Bin 0 -> 2249 bytes resources/scrapers/fuzzywuzzy/utils.py | 76 + resources/scrapers/fuzzywuzzy/utils.pyc | Bin 0 -> 3057 bytes resources/scrapers/fuzzywuzzy/utils.pyo | Bin 0 -> 3057 bytes resources/scrapers/html.py | 57 + resources/scrapers/html.pyo | Bin 0 -> 2699 bytes resources/scrapers/kinopoisk.pyo | Bin 0 -> 26820 bytes resources/scrapers/kinopoisk/HTTP.py | 215 + resources/scrapers/kinopoisk/HTTP.pyo | Bin 0 -> 7697 bytes resources/scrapers/kinopoisk/LOGGER.py | 40 + resources/scrapers/kinopoisk/LOGGER.pyo | Bin 0 -> 1774 bytes resources/scrapers/kinopoisk/__init__.py | 96 + resources/scrapers/kinopoisk/__init__.pyo | Bin 0 -> 3325 bytes resources/scrapers/kinopoisk/common.py | 382 ++ resources/scrapers/kinopoisk/common.pyo | Bin 0 -> 13067 bytes resources/scrapers/kinopoisk/kinopoisk.pyo | Bin 0 -> 26405 bytes resources/scrapers/kinopoisk/pageparser.py | 175 + resources/scrapers/kinopoisk/pageparser.pyo | Bin 0 -> 4366 bytes .../scrapers/kinopoisk/pluginsettings.py | 49 + .../scrapers/kinopoisk/pluginsettings.pyo | Bin 0 -> 1238 bytes resources/scrapers/kinopoisk/translit.py | 288 + resources/scrapers/kinopoisk/translit.pyo | Bin 0 -> 8322 bytes resources/scrapers/kinopoisks.py | 565 ++ resources/scrapers/kinopoisks.pyo | Bin 0 -> 26468 bytes resources/scrapers/net.py | 307 + resources/scrapers/net.pyc | Bin 0 -> 10748 bytes resources/scrapers/net.pyo | Bin 0 -> 10756 bytes resources/scrapers/requests/__init__.py | 77 + resources/scrapers/requests/__init__.pyc | Bin 0 -> 2671 bytes resources/scrapers/requests/__init__.pyo | Bin 0 -> 2671 bytes resources/scrapers/requests/adapters.py | 437 ++ resources/scrapers/requests/adapters.pyc | Bin 0 -> 16770 bytes resources/scrapers/requests/adapters.pyo | Bin 0 -> 16770 bytes resources/scrapers/requests/api.py | 131 + resources/scrapers/requests/api.pyc | Bin 0 -> 6158 bytes resources/scrapers/requests/api.pyo | Bin 0 -> 6158 bytes resources/scrapers/requests/auth.py | 208 + resources/scrapers/requests/auth.pyc | Bin 0 -> 8491 bytes resources/scrapers/requests/auth.pyo | Bin 0 -> 8491 bytes resources/scrapers/requests/cacert.pem | 5026 +++++++++++++++++ resources/scrapers/requests/certs.py | 25 + resources/scrapers/requests/certs.pyc | Bin 0 -> 975 bytes resources/scrapers/requests/certs.pyo | Bin 0 -> 975 bytes resources/scrapers/requests/compat.py | 115 + resources/scrapers/requests/compat.pyc | Bin 0 -> 2558 bytes resources/scrapers/requests/compat.pyo | Bin 0 -> 2558 bytes resources/scrapers/requests/cookies.py | 454 ++ resources/scrapers/requests/cookies.pyc | Bin 0 -> 22819 bytes resources/scrapers/requests/cookies.pyo | Bin 0 -> 22819 bytes resources/scrapers/requests/exceptions.py | 99 + resources/scrapers/requests/exceptions.pyc | Bin 0 -> 6272 bytes resources/scrapers/requests/exceptions.pyo | Bin 0 -> 6272 bytes resources/scrapers/requests/hooks.py | 45 + resources/scrapers/requests/hooks.pyc | Bin 0 -> 1211 bytes resources/scrapers/requests/hooks.pyo | Bin 0 -> 1211 bytes resources/scrapers/requests/models.py | 837 +++ resources/scrapers/requests/models.pyc | Bin 0 -> 27338 bytes resources/scrapers/requests/models.pyo | Bin 0 -> 27338 bytes .../scrapers/requests/packages/__init__.py | 3 + .../scrapers/requests/packages/__init__.pyc | Bin 0 -> 317 bytes .../scrapers/requests/packages/__init__.pyo | Bin 0 -> 317 bytes .../requests/packages/chardet/__init__.py | 32 + .../requests/packages/chardet/__init__.pyc | Bin 0 -> 937 bytes .../requests/packages/chardet/__init__.pyo | Bin 0 -> 937 bytes .../requests/packages/chardet/big5freq.py | 925 +++ .../requests/packages/chardet/big5prober.py | 42 + .../requests/packages/chardet/chardetect.py | 80 + .../packages/chardet/chardistribution.py | 231 + .../packages/chardet/charsetgroupprober.py | 106 + .../packages/chardet/charsetprober.py | 62 + .../packages/chardet/codingstatemachine.py | 61 + .../requests/packages/chardet/compat.py | 34 + .../requests/packages/chardet/constants.py | 39 + .../requests/packages/chardet/cp949prober.py | 44 + .../requests/packages/chardet/escprober.py | 86 + .../requests/packages/chardet/escsm.py | 242 + .../requests/packages/chardet/eucjpprober.py | 90 + .../requests/packages/chardet/euckrfreq.py | 596 ++ .../requests/packages/chardet/euckrprober.py | 42 + .../requests/packages/chardet/euctwfreq.py | 428 ++ .../requests/packages/chardet/euctwprober.py | 41 + .../requests/packages/chardet/gb2312freq.py | 472 ++ .../requests/packages/chardet/gb2312prober.py | 41 + .../requests/packages/chardet/hebrewprober.py | 283 + .../requests/packages/chardet/jisfreq.py | 569 ++ .../requests/packages/chardet/jpcntx.py | 227 + .../packages/chardet/langbulgarianmodel.py | 229 + .../packages/chardet/langcyrillicmodel.py | 329 ++ .../packages/chardet/langgreekmodel.py | 225 + .../packages/chardet/langhebrewmodel.py | 201 + .../packages/chardet/langhungarianmodel.py | 225 + .../packages/chardet/langthaimodel.py | 200 + .../requests/packages/chardet/latin1prober.py | 139 + .../packages/chardet/mbcharsetprober.py | 86 + .../packages/chardet/mbcsgroupprober.py | 54 + .../requests/packages/chardet/mbcssm.py | 572 ++ .../packages/chardet/sbcharsetprober.py | 120 + .../packages/chardet/sbcsgroupprober.py | 69 + .../requests/packages/chardet/sjisprober.py | 91 + .../packages/chardet/universaldetector.py | 170 + .../requests/packages/chardet/utf8prober.py | 76 + .../requests/packages/urllib3/__init__.py | 66 + .../requests/packages/urllib3/__init__.pyc | Bin 0 -> 2936 bytes .../requests/packages/urllib3/__init__.pyo | Bin 0 -> 2936 bytes .../requests/packages/urllib3/_collections.py | 198 + .../packages/urllib3/_collections.pyc | Bin 0 -> 11222 bytes .../packages/urllib3/_collections.pyo | Bin 0 -> 11222 bytes .../requests/packages/urllib3/connection.py | 262 + .../requests/packages/urllib3/connection.pyc | Bin 0 -> 9038 bytes .../requests/packages/urllib3/connection.pyo | Bin 0 -> 9038 bytes .../packages/urllib3/connectionpool.py | 761 +++ .../packages/urllib3/connectionpool.pyc | Bin 0 -> 24618 bytes .../packages/urllib3/connectionpool.pyo | Bin 0 -> 24618 bytes .../packages/urllib3/contrib/__init__.py | 0 .../packages/urllib3/contrib/__init__.pyc | Bin 0 -> 217 bytes .../packages/urllib3/contrib/__init__.pyo | Bin 0 -> 217 bytes .../packages/urllib3/contrib/ntlmpool.py | 114 + .../packages/urllib3/contrib/pyopenssl.py | 303 + .../packages/urllib3/contrib/pyopenssl.pyc | Bin 0 -> 11613 bytes .../packages/urllib3/contrib/pyopenssl.pyo | Bin 0 -> 11613 bytes .../requests/packages/urllib3/exceptions.py | 159 + .../requests/packages/urllib3/exceptions.pyc | Bin 0 -> 10223 bytes .../requests/packages/urllib3/exceptions.pyo | Bin 0 -> 10223 bytes .../requests/packages/urllib3/fields.py | 177 + .../requests/packages/urllib3/fields.pyc | Bin 0 -> 7325 bytes .../requests/packages/urllib3/fields.pyo | Bin 0 -> 7325 bytes .../requests/packages/urllib3/filepost.py | 93 + .../requests/packages/urllib3/filepost.pyc | Bin 0 -> 3669 bytes .../requests/packages/urllib3/filepost.pyo | Bin 0 -> 3669 bytes .../packages/urllib3/packages/__init__.py | 4 + .../packages/urllib3/packages/__init__.pyc | Bin 0 -> 345 bytes .../packages/urllib3/packages/__init__.pyo | Bin 0 -> 345 bytes .../packages/urllib3/packages/ordered_dict.py | 259 + .../urllib3/packages/ordered_dict.pyc | Bin 0 -> 11839 bytes .../urllib3/packages/ordered_dict.pyo | Bin 0 -> 11839 bytes .../requests/packages/urllib3/packages/six.py | 385 ++ .../packages/urllib3/packages/six.pyc | Bin 0 -> 16171 bytes .../packages/urllib3/packages/six.pyo | Bin 0 -> 16171 bytes .../packages/ssl_match_hostname/__init__.py | 13 + .../packages/ssl_match_hostname/__init__.pyc | Bin 0 -> 580 bytes .../packages/ssl_match_hostname/__init__.pyo | Bin 0 -> 580 bytes .../ssl_match_hostname/_implementation.py | 105 + .../ssl_match_hostname/_implementation.pyc | Bin 0 -> 3191 bytes .../ssl_match_hostname/_implementation.pyo | Bin 0 -> 3191 bytes .../requests/packages/urllib3/poolmanager.py | 265 + .../requests/packages/urllib3/poolmanager.pyc | Bin 0 -> 10420 bytes .../requests/packages/urllib3/poolmanager.pyo | Bin 0 -> 10295 bytes .../requests/packages/urllib3/request.py | 141 + .../requests/packages/urllib3/request.pyc | Bin 0 -> 6401 bytes .../requests/packages/urllib3/request.pyo | Bin 0 -> 6401 bytes .../requests/packages/urllib3/response.py | 333 ++ .../requests/packages/urllib3/response.pyc | Bin 0 -> 12852 bytes .../requests/packages/urllib3/response.pyo | Bin 0 -> 12852 bytes .../packages/urllib3/util/__init__.py | 24 + .../packages/urllib3/util/__init__.pyc | Bin 0 -> 857 bytes .../packages/urllib3/util/__init__.pyo | Bin 0 -> 857 bytes .../packages/urllib3/util/connection.py | 97 + .../packages/urllib3/util/connection.pyc | Bin 0 -> 3213 bytes .../packages/urllib3/util/connection.pyo | Bin 0 -> 3213 bytes .../requests/packages/urllib3/util/request.py | 71 + .../packages/urllib3/util/request.pyc | Bin 0 -> 2280 bytes .../packages/urllib3/util/request.pyo | Bin 0 -> 2280 bytes .../packages/urllib3/util/response.py | 22 + .../packages/urllib3/util/response.pyc | Bin 0 -> 772 bytes .../packages/urllib3/util/response.pyo | Bin 0 -> 772 bytes .../requests/packages/urllib3/util/retry.py | 285 + .../requests/packages/urllib3/util/retry.pyc | Bin 0 -> 10646 bytes .../requests/packages/urllib3/util/retry.pyo | Bin 0 -> 10646 bytes .../requests/packages/urllib3/util/ssl_.py | 254 + .../requests/packages/urllib3/util/ssl_.pyc | Bin 0 -> 9011 bytes .../requests/packages/urllib3/util/ssl_.pyo | Bin 0 -> 9011 bytes .../requests/packages/urllib3/util/timeout.py | 240 + .../packages/urllib3/util/timeout.pyc | Bin 0 -> 10385 bytes .../packages/urllib3/util/timeout.pyo | Bin 0 -> 10385 bytes .../requests/packages/urllib3/util/url.py | 212 + .../requests/packages/urllib3/util/url.pyc | Bin 0 -> 6593 bytes .../requests/packages/urllib3/util/url.pyo | Bin 0 -> 6593 bytes resources/scrapers/requests/sessions.py | 682 +++ resources/scrapers/requests/sessions.pyc | Bin 0 -> 21450 bytes resources/scrapers/requests/sessions.pyo | Bin 0 -> 21450 bytes resources/scrapers/requests/status_codes.py | 89 + resources/scrapers/requests/status_codes.pyc | Bin 0 -> 4641 bytes resources/scrapers/requests/status_codes.pyo | Bin 0 -> 4686 bytes resources/scrapers/requests/structures.py | 104 + resources/scrapers/requests/structures.pyc | Bin 0 -> 6126 bytes resources/scrapers/requests/structures.pyo | Bin 0 -> 6126 bytes resources/scrapers/requests/utils.py | 697 +++ resources/scrapers/requests/utils.pyc | Bin 0 -> 22082 bytes resources/scrapers/requests/utils.pyo | Bin 0 -> 22082 bytes resources/scrapers/scrapers.py | 128 + resources/scrapers/scrapers.pyo | Bin 0 -> 4717 bytes resources/scrapers/tmdb.py | 472 ++ resources/scrapers/tmdb.pyc | Bin 0 -> 27329 bytes resources/scrapers/tmdb.pyo | Bin 0 -> 27835 bytes resources/scrapers/tmdbs.py | 352 ++ resources/scrapers/tmdbs.pyo | Bin 0 -> 10823 bytes resources/scrapers/tvdb.py | 417 ++ resources/scrapers/tvdb.pyo | Bin 0 -> 13330 bytes resources/searchers/EZTV.py | 91 + resources/searchers/EZTV.pyo | Bin 0 -> 3314 bytes resources/searchers/ExtraTorrent.py | 101 + resources/searchers/ExtraTorrent.pyo | Bin 0 -> 4384 bytes resources/searchers/KickAssSo.py | 100 + resources/searchers/KickAssSo.pyo | Bin 0 -> 3451 bytes resources/searchers/NNMClubRu.py | 155 + resources/searchers/NNMClubRu.pyo | Bin 0 -> 5934 bytes resources/searchers/Nyaa.py | 89 + resources/searchers/Nyaa.pyo | Bin 0 -> 3446 bytes resources/searchers/OldPirateBay.py | 90 + resources/searchers/OldPirateBay.pyo | Bin 0 -> 3579 bytes resources/searchers/OpenSharing.py | 93 + resources/searchers/OpenSharing.pyo | Bin 0 -> 3639 bytes resources/searchers/RiperAM.py | 109 + resources/searchers/RiperAM.pyo | Bin 0 -> 10866 bytes resources/searchers/RuTorOrg.py | 107 + resources/searchers/RuTorOrg.pyo | Bin 0 -> 4104 bytes resources/searchers/RuTrackerOrg.py | 182 + resources/searchers/RuTrackerOrg.pyo | Bin 0 -> 9260 bytes resources/searchers/TFileME.py | 129 + resources/searchers/TFileME.pyo | Bin 0 -> 7759 bytes resources/searchers/ThePirateBaySe.py | 89 + resources/searchers/ThePirateBaySe.pyo | Bin 0 -> 3150 bytes resources/searchers/icons/EZTV.png | Bin 0 -> 112684 bytes resources/searchers/icons/ExtraTorrent.png | Bin 0 -> 14943 bytes resources/searchers/icons/KickAssSo.png | Bin 0 -> 27220 bytes resources/searchers/icons/KinoZalTV.png | Bin 0 -> 31350 bytes resources/searchers/icons/Nyaa.png | Bin 0 -> 104468 bytes resources/searchers/icons/OldPirateBay3.png | Bin 0 -> 54328 bytes resources/searchers/icons/OpenSharing.png | Bin 0 -> 44678 bytes resources/searchers/icons/RiperAM.png | Bin 0 -> 30415 bytes resources/searchers/icons/TFileME.png | Bin 0 -> 60950 bytes resources/searchers/icons/nnm-club.ru.png | Bin 0 -> 59578 bytes resources/searchers/icons/rutor.org.png | Bin 0 -> 60219 bytes resources/searchers/icons/rutracker.org.png | Bin 0 -> 50598 bytes resources/searchers/icons/thepiratebay.se.png | Bin 0 -> 56456 bytes resources/searchers/unused/KinoZalTV.py | 131 + resources/settings.xml | 130 + resources/utorrent/__init__.py | 0 resources/utorrent/__init__.pyc | Bin 0 -> 183 bytes resources/utorrent/__init__.pyo | Bin 0 -> 183 bytes resources/utorrent/dopal/__init__.py | 65 + resources/utorrent/dopal/__init__.pyc | Bin 0 -> 1489 bytes resources/utorrent/dopal/__init__.pyo | Bin 0 -> 1489 bytes resources/utorrent/dopal/aztypes.py | 367 ++ resources/utorrent/dopal/aztypes.pyc | Bin 0 -> 14950 bytes resources/utorrent/dopal/aztypes.pyo | Bin 0 -> 14950 bytes resources/utorrent/dopal/class_defs.py | 5016 ++++++++++++++++ resources/utorrent/dopal/class_defs.pyc | Bin 0 -> 173205 bytes resources/utorrent/dopal/class_defs.pyo | Bin 0 -> 173205 bytes resources/utorrent/dopal/classes.py | 317 ++ resources/utorrent/dopal/classes.pyc | Bin 0 -> 20761 bytes resources/utorrent/dopal/classes.pyo | Bin 0 -> 20809 bytes resources/utorrent/dopal/convert.py | 518 ++ resources/utorrent/dopal/convert.pyc | Bin 0 -> 15243 bytes resources/utorrent/dopal/convert.pyo | Bin 0 -> 15243 bytes resources/utorrent/dopal/core.py | 1024 ++++ resources/utorrent/dopal/core.pyc | Bin 0 -> 31102 bytes resources/utorrent/dopal/core.pyo | Bin 0 -> 31118 bytes resources/utorrent/dopal/debug.py | 177 + resources/utorrent/dopal/debug.pyc | Bin 0 -> 7124 bytes resources/utorrent/dopal/debug.pyo | Bin 0 -> 7124 bytes resources/utorrent/dopal/errors.py | 515 ++ resources/utorrent/dopal/errors.pyc | Bin 0 -> 22492 bytes resources/utorrent/dopal/errors.pyo | Bin 0 -> 22496 bytes resources/utorrent/dopal/interact.py | 100 + resources/utorrent/dopal/interact.pyc | Bin 0 -> 2587 bytes resources/utorrent/dopal/logutils.py | 35 + resources/utorrent/dopal/main.py | 84 + resources/utorrent/dopal/main.pyc | Bin 0 -> 2900 bytes resources/utorrent/dopal/main.pyo | Bin 0 -> 2900 bytes resources/utorrent/dopal/obj_impl.py | 321 ++ resources/utorrent/dopal/obj_impl.pyc | Bin 0 -> 13570 bytes resources/utorrent/dopal/obj_impl.pyo | Bin 0 -> 13570 bytes resources/utorrent/dopal/objects.py | 578 ++ resources/utorrent/dopal/objects.pyc | Bin 0 -> 20626 bytes resources/utorrent/dopal/objects.pyo | Bin 0 -> 20440 bytes resources/utorrent/dopal/persistency.py | 61 + resources/utorrent/dopal/scripting.py | 1449 +++++ resources/utorrent/dopal/utils.py | 195 + resources/utorrent/dopal/utils.pyc | Bin 0 -> 6687 bytes resources/utorrent/dopal/utils.pyo | Bin 0 -> 6687 bytes resources/utorrent/dopal/xmlutils.py | 214 + resources/utorrent/dopal/xmlutils.pyc | Bin 0 -> 6780 bytes resources/utorrent/dopal/xmlutils.pyo | Bin 0 -> 6780 bytes resources/utorrent/net.py | 1064 ++++ resources/utorrent/net.pyo | Bin 0 -> 37643 bytes 396 files changed, 49459 insertions(+) create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/plugin.video.torrenter.iml create mode 100644 .idea/scopes/scope_settings.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 AceStream.py create mode 100644 AceStream.pyo create mode 100644 BeautifulSoup.py create mode 100644 BeautifulSoup.pyc create mode 100644 BeautifulSoup.pyo create mode 100644 Content.py create mode 100644 Content.pyc create mode 100644 Content.pyo create mode 100644 Core.py create mode 100644 Core.pyo create mode 100644 Downloader.py create mode 100644 Downloader.pyo create mode 100644 Libtorrent.py create mode 100644 Libtorrent.pyo create mode 100644 Localization.py create mode 100644 Localization.pyc create mode 100644 Localization.pyo create mode 100644 Player.py create mode 100644 Player.pyo create mode 100644 Proxier.py create mode 100644 README.txt create mode 100644 Rates.py create mode 100644 SearcherABC.py create mode 100644 SearcherABC.pyo create mode 100644 addon.xml create mode 100644 cal.py create mode 100644 changelog.txt create mode 100644 controlcenter.py create mode 100644 default.py create mode 100644 functions.py create mode 100644 functions.pyc create mode 100644 functions.pyo create mode 100644 icon.png create mode 100644 icons/clear.png create mode 100644 icons/fav.png create mode 100644 icons/history2.png create mode 100644 icons/list.png create mode 100644 icons/magnet.png create mode 100644 icons/media.png create mode 100644 icons/search.png create mode 100644 icons/settings.png create mode 100644 icons/torrent-client.png create mode 100644 icons/torrentPlayer.png create mode 100644 icons/unfav.png create mode 100644 icons/video.png create mode 100644 resources/__init__.py create mode 100644 resources/__init__.pyc create mode 100644 resources/__init__.pyo create mode 100644 resources/contenters/CXZ.py create mode 100644 resources/contenters/CXZ.pyo create mode 100644 resources/contenters/EZTV.py create mode 100644 resources/contenters/EZTV.pyo create mode 100644 resources/contenters/FastTorrent.py create mode 100644 resources/contenters/FastTorrent.pyo create mode 100644 resources/contenters/IMDB.py create mode 100644 resources/contenters/IMDB.pyo create mode 100644 resources/contenters/KinoPoisk.py create mode 100644 resources/contenters/KinoPoisk.pyo create mode 100644 resources/contenters/RiperAM.py create mode 100644 resources/contenters/RiperAM.pyo create mode 100644 resources/images/black.png create mode 100644 resources/language/English/strings.xml create mode 100644 resources/language/Russian/strings.xml create mode 100644 resources/pyxbmct/__init__.py create mode 100644 resources/pyxbmct/__init__.pyo create mode 100644 resources/pyxbmct/addonwindow.py create mode 100644 resources/pyxbmct/addonwindow.pyo create mode 100644 resources/pyxbmct/textures/default/AddonWindow/ContentPanel.png create mode 100644 resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton-focus.png create mode 100644 resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton.png create mode 100644 resources/pyxbmct/textures/default/AddonWindow/SKINDEFAULT.jpg create mode 100644 resources/pyxbmct/textures/default/AddonWindow/dialogheader.png create mode 100644 resources/pyxbmct/textures/default/Button/KeyboardKey.png create mode 100644 resources/pyxbmct/textures/default/Button/KeyboardKeyNF.png create mode 100644 resources/pyxbmct/textures/default/Edit/black-back2.png create mode 100644 resources/pyxbmct/textures/default/Edit/button-focus.png create mode 100644 resources/pyxbmct/textures/default/List/MenuItemFO.png create mode 100644 resources/pyxbmct/textures/default/List/MenuItemNF.png create mode 100644 resources/pyxbmct/textures/default/RadioButton/MenuItemFO.png create mode 100644 resources/pyxbmct/textures/default/RadioButton/MenuItemNF.png create mode 100644 resources/pyxbmct/textures/default/RadioButton/radiobutton-focus.png create mode 100644 resources/pyxbmct/textures/default/RadioButton/radiobutton-nofocus.png create mode 100644 resources/pyxbmct/textures/default/Slider/osd_slider_bg.png create mode 100644 resources/pyxbmct/textures/default/Slider/osd_slider_bg_2.png create mode 100644 resources/pyxbmct/textures/default/Slider/osd_slider_nib.png create mode 100644 resources/pyxbmct/textures/default/Slider/osd_slider_nibNF.png create mode 100644 resources/scrapers/__init__.py create mode 100644 resources/scrapers/__init__.pyc create mode 100644 resources/scrapers/__init__.pyo create mode 100644 resources/scrapers/cache.py create mode 100644 resources/scrapers/cache.pyo create mode 100644 resources/scrapers/fuzzywuzzy/StringMatcher.py create mode 100644 resources/scrapers/fuzzywuzzy/StringMatcher.pyc create mode 100644 resources/scrapers/fuzzywuzzy/StringMatcher.pyo create mode 100644 resources/scrapers/fuzzywuzzy/__init__.py create mode 100644 resources/scrapers/fuzzywuzzy/__init__.pyc create mode 100644 resources/scrapers/fuzzywuzzy/__init__.pyo create mode 100644 resources/scrapers/fuzzywuzzy/fuzz.py create mode 100644 resources/scrapers/fuzzywuzzy/fuzz.pyc create mode 100644 resources/scrapers/fuzzywuzzy/fuzz.pyo create mode 100644 resources/scrapers/fuzzywuzzy/process.py create mode 100644 resources/scrapers/fuzzywuzzy/string_processing.py create mode 100644 resources/scrapers/fuzzywuzzy/string_processing.pyc create mode 100644 resources/scrapers/fuzzywuzzy/string_processing.pyo create mode 100644 resources/scrapers/fuzzywuzzy/utils.py create mode 100644 resources/scrapers/fuzzywuzzy/utils.pyc create mode 100644 resources/scrapers/fuzzywuzzy/utils.pyo create mode 100644 resources/scrapers/html.py create mode 100644 resources/scrapers/html.pyo create mode 100644 resources/scrapers/kinopoisk.pyo create mode 100644 resources/scrapers/kinopoisk/HTTP.py create mode 100644 resources/scrapers/kinopoisk/HTTP.pyo create mode 100644 resources/scrapers/kinopoisk/LOGGER.py create mode 100644 resources/scrapers/kinopoisk/LOGGER.pyo create mode 100644 resources/scrapers/kinopoisk/__init__.py create mode 100644 resources/scrapers/kinopoisk/__init__.pyo create mode 100644 resources/scrapers/kinopoisk/common.py create mode 100644 resources/scrapers/kinopoisk/common.pyo create mode 100644 resources/scrapers/kinopoisk/kinopoisk.pyo create mode 100644 resources/scrapers/kinopoisk/pageparser.py create mode 100644 resources/scrapers/kinopoisk/pageparser.pyo create mode 100644 resources/scrapers/kinopoisk/pluginsettings.py create mode 100644 resources/scrapers/kinopoisk/pluginsettings.pyo create mode 100644 resources/scrapers/kinopoisk/translit.py create mode 100644 resources/scrapers/kinopoisk/translit.pyo create mode 100644 resources/scrapers/kinopoisks.py create mode 100644 resources/scrapers/kinopoisks.pyo create mode 100644 resources/scrapers/net.py create mode 100644 resources/scrapers/net.pyc create mode 100644 resources/scrapers/net.pyo create mode 100644 resources/scrapers/requests/__init__.py create mode 100644 resources/scrapers/requests/__init__.pyc create mode 100644 resources/scrapers/requests/__init__.pyo create mode 100644 resources/scrapers/requests/adapters.py create mode 100644 resources/scrapers/requests/adapters.pyc create mode 100644 resources/scrapers/requests/adapters.pyo create mode 100644 resources/scrapers/requests/api.py create mode 100644 resources/scrapers/requests/api.pyc create mode 100644 resources/scrapers/requests/api.pyo create mode 100644 resources/scrapers/requests/auth.py create mode 100644 resources/scrapers/requests/auth.pyc create mode 100644 resources/scrapers/requests/auth.pyo create mode 100644 resources/scrapers/requests/cacert.pem create mode 100644 resources/scrapers/requests/certs.py create mode 100644 resources/scrapers/requests/certs.pyc create mode 100644 resources/scrapers/requests/certs.pyo create mode 100644 resources/scrapers/requests/compat.py create mode 100644 resources/scrapers/requests/compat.pyc create mode 100644 resources/scrapers/requests/compat.pyo create mode 100644 resources/scrapers/requests/cookies.py create mode 100644 resources/scrapers/requests/cookies.pyc create mode 100644 resources/scrapers/requests/cookies.pyo create mode 100644 resources/scrapers/requests/exceptions.py create mode 100644 resources/scrapers/requests/exceptions.pyc create mode 100644 resources/scrapers/requests/exceptions.pyo create mode 100644 resources/scrapers/requests/hooks.py create mode 100644 resources/scrapers/requests/hooks.pyc create mode 100644 resources/scrapers/requests/hooks.pyo create mode 100644 resources/scrapers/requests/models.py create mode 100644 resources/scrapers/requests/models.pyc create mode 100644 resources/scrapers/requests/models.pyo create mode 100644 resources/scrapers/requests/packages/__init__.py create mode 100644 resources/scrapers/requests/packages/__init__.pyc create mode 100644 resources/scrapers/requests/packages/__init__.pyo create mode 100644 resources/scrapers/requests/packages/chardet/__init__.py create mode 100644 resources/scrapers/requests/packages/chardet/__init__.pyc create mode 100644 resources/scrapers/requests/packages/chardet/__init__.pyo create mode 100644 resources/scrapers/requests/packages/chardet/big5freq.py create mode 100644 resources/scrapers/requests/packages/chardet/big5prober.py create mode 100644 resources/scrapers/requests/packages/chardet/chardetect.py create mode 100644 resources/scrapers/requests/packages/chardet/chardistribution.py create mode 100644 resources/scrapers/requests/packages/chardet/charsetgroupprober.py create mode 100644 resources/scrapers/requests/packages/chardet/charsetprober.py create mode 100644 resources/scrapers/requests/packages/chardet/codingstatemachine.py create mode 100644 resources/scrapers/requests/packages/chardet/compat.py create mode 100644 resources/scrapers/requests/packages/chardet/constants.py create mode 100644 resources/scrapers/requests/packages/chardet/cp949prober.py create mode 100644 resources/scrapers/requests/packages/chardet/escprober.py create mode 100644 resources/scrapers/requests/packages/chardet/escsm.py create mode 100644 resources/scrapers/requests/packages/chardet/eucjpprober.py create mode 100644 resources/scrapers/requests/packages/chardet/euckrfreq.py create mode 100644 resources/scrapers/requests/packages/chardet/euckrprober.py create mode 100644 resources/scrapers/requests/packages/chardet/euctwfreq.py create mode 100644 resources/scrapers/requests/packages/chardet/euctwprober.py create mode 100644 resources/scrapers/requests/packages/chardet/gb2312freq.py create mode 100644 resources/scrapers/requests/packages/chardet/gb2312prober.py create mode 100644 resources/scrapers/requests/packages/chardet/hebrewprober.py create mode 100644 resources/scrapers/requests/packages/chardet/jisfreq.py create mode 100644 resources/scrapers/requests/packages/chardet/jpcntx.py create mode 100644 resources/scrapers/requests/packages/chardet/langbulgarianmodel.py create mode 100644 resources/scrapers/requests/packages/chardet/langcyrillicmodel.py create mode 100644 resources/scrapers/requests/packages/chardet/langgreekmodel.py create mode 100644 resources/scrapers/requests/packages/chardet/langhebrewmodel.py create mode 100644 resources/scrapers/requests/packages/chardet/langhungarianmodel.py create mode 100644 resources/scrapers/requests/packages/chardet/langthaimodel.py create mode 100644 resources/scrapers/requests/packages/chardet/latin1prober.py create mode 100644 resources/scrapers/requests/packages/chardet/mbcharsetprober.py create mode 100644 resources/scrapers/requests/packages/chardet/mbcsgroupprober.py create mode 100644 resources/scrapers/requests/packages/chardet/mbcssm.py create mode 100644 resources/scrapers/requests/packages/chardet/sbcharsetprober.py create mode 100644 resources/scrapers/requests/packages/chardet/sbcsgroupprober.py create mode 100644 resources/scrapers/requests/packages/chardet/sjisprober.py create mode 100644 resources/scrapers/requests/packages/chardet/universaldetector.py create mode 100644 resources/scrapers/requests/packages/chardet/utf8prober.py create mode 100644 resources/scrapers/requests/packages/urllib3/__init__.py create mode 100644 resources/scrapers/requests/packages/urllib3/__init__.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/__init__.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/_collections.py create mode 100644 resources/scrapers/requests/packages/urllib3/_collections.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/_collections.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/connection.py create mode 100644 resources/scrapers/requests/packages/urllib3/connection.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/connection.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/connectionpool.py create mode 100644 resources/scrapers/requests/packages/urllib3/connectionpool.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/connectionpool.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/contrib/__init__.py create mode 100644 resources/scrapers/requests/packages/urllib3/contrib/__init__.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/contrib/__init__.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/contrib/ntlmpool.py create mode 100644 resources/scrapers/requests/packages/urllib3/contrib/pyopenssl.py create mode 100644 resources/scrapers/requests/packages/urllib3/contrib/pyopenssl.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/contrib/pyopenssl.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/exceptions.py create mode 100644 resources/scrapers/requests/packages/urllib3/exceptions.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/exceptions.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/fields.py create mode 100644 resources/scrapers/requests/packages/urllib3/fields.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/fields.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/filepost.py create mode 100644 resources/scrapers/requests/packages/urllib3/filepost.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/filepost.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/packages/__init__.py create mode 100644 resources/scrapers/requests/packages/urllib3/packages/__init__.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/packages/__init__.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/packages/ordered_dict.py create mode 100644 resources/scrapers/requests/packages/urllib3/packages/ordered_dict.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/packages/ordered_dict.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/packages/six.py create mode 100644 resources/scrapers/requests/packages/urllib3/packages/six.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/packages/six.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/poolmanager.py create mode 100644 resources/scrapers/requests/packages/urllib3/poolmanager.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/poolmanager.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/request.py create mode 100644 resources/scrapers/requests/packages/urllib3/request.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/request.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/response.py create mode 100644 resources/scrapers/requests/packages/urllib3/response.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/response.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/util/__init__.py create mode 100644 resources/scrapers/requests/packages/urllib3/util/__init__.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/util/__init__.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/util/connection.py create mode 100644 resources/scrapers/requests/packages/urllib3/util/connection.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/util/connection.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/util/request.py create mode 100644 resources/scrapers/requests/packages/urllib3/util/request.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/util/request.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/util/response.py create mode 100644 resources/scrapers/requests/packages/urllib3/util/response.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/util/response.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/util/retry.py create mode 100644 resources/scrapers/requests/packages/urllib3/util/retry.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/util/retry.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/util/ssl_.py create mode 100644 resources/scrapers/requests/packages/urllib3/util/ssl_.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/util/ssl_.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/util/timeout.py create mode 100644 resources/scrapers/requests/packages/urllib3/util/timeout.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/util/timeout.pyo create mode 100644 resources/scrapers/requests/packages/urllib3/util/url.py create mode 100644 resources/scrapers/requests/packages/urllib3/util/url.pyc create mode 100644 resources/scrapers/requests/packages/urllib3/util/url.pyo create mode 100644 resources/scrapers/requests/sessions.py create mode 100644 resources/scrapers/requests/sessions.pyc create mode 100644 resources/scrapers/requests/sessions.pyo create mode 100644 resources/scrapers/requests/status_codes.py create mode 100644 resources/scrapers/requests/status_codes.pyc create mode 100644 resources/scrapers/requests/status_codes.pyo create mode 100644 resources/scrapers/requests/structures.py create mode 100644 resources/scrapers/requests/structures.pyc create mode 100644 resources/scrapers/requests/structures.pyo create mode 100644 resources/scrapers/requests/utils.py create mode 100644 resources/scrapers/requests/utils.pyc create mode 100644 resources/scrapers/requests/utils.pyo create mode 100644 resources/scrapers/scrapers.py create mode 100644 resources/scrapers/scrapers.pyo create mode 100644 resources/scrapers/tmdb.py create mode 100644 resources/scrapers/tmdb.pyc create mode 100644 resources/scrapers/tmdb.pyo create mode 100644 resources/scrapers/tmdbs.py create mode 100644 resources/scrapers/tmdbs.pyo create mode 100644 resources/scrapers/tvdb.py create mode 100644 resources/scrapers/tvdb.pyo create mode 100644 resources/searchers/EZTV.py create mode 100644 resources/searchers/EZTV.pyo create mode 100644 resources/searchers/ExtraTorrent.py create mode 100644 resources/searchers/ExtraTorrent.pyo create mode 100644 resources/searchers/KickAssSo.py create mode 100644 resources/searchers/KickAssSo.pyo create mode 100644 resources/searchers/NNMClubRu.py create mode 100644 resources/searchers/NNMClubRu.pyo create mode 100644 resources/searchers/Nyaa.py create mode 100644 resources/searchers/Nyaa.pyo create mode 100644 resources/searchers/OldPirateBay.py create mode 100644 resources/searchers/OldPirateBay.pyo create mode 100644 resources/searchers/OpenSharing.py create mode 100644 resources/searchers/OpenSharing.pyo create mode 100644 resources/searchers/RiperAM.py create mode 100644 resources/searchers/RiperAM.pyo create mode 100644 resources/searchers/RuTorOrg.py create mode 100644 resources/searchers/RuTorOrg.pyo create mode 100644 resources/searchers/RuTrackerOrg.py create mode 100644 resources/searchers/RuTrackerOrg.pyo create mode 100644 resources/searchers/TFileME.py create mode 100644 resources/searchers/TFileME.pyo create mode 100644 resources/searchers/ThePirateBaySe.py create mode 100644 resources/searchers/ThePirateBaySe.pyo create mode 100644 resources/searchers/icons/EZTV.png create mode 100644 resources/searchers/icons/ExtraTorrent.png create mode 100644 resources/searchers/icons/KickAssSo.png create mode 100644 resources/searchers/icons/KinoZalTV.png create mode 100644 resources/searchers/icons/Nyaa.png create mode 100644 resources/searchers/icons/OldPirateBay3.png create mode 100644 resources/searchers/icons/OpenSharing.png create mode 100644 resources/searchers/icons/RiperAM.png create mode 100644 resources/searchers/icons/TFileME.png create mode 100644 resources/searchers/icons/nnm-club.ru.png create mode 100644 resources/searchers/icons/rutor.org.png create mode 100644 resources/searchers/icons/rutracker.org.png create mode 100644 resources/searchers/icons/thepiratebay.se.png create mode 100644 resources/searchers/unused/KinoZalTV.py create mode 100644 resources/settings.xml create mode 100644 resources/utorrent/__init__.py create mode 100644 resources/utorrent/__init__.pyc create mode 100644 resources/utorrent/__init__.pyo create mode 100644 resources/utorrent/dopal/__init__.py create mode 100644 resources/utorrent/dopal/__init__.pyc create mode 100644 resources/utorrent/dopal/__init__.pyo create mode 100644 resources/utorrent/dopal/aztypes.py create mode 100644 resources/utorrent/dopal/aztypes.pyc create mode 100644 resources/utorrent/dopal/aztypes.pyo create mode 100644 resources/utorrent/dopal/class_defs.py create mode 100644 resources/utorrent/dopal/class_defs.pyc create mode 100644 resources/utorrent/dopal/class_defs.pyo create mode 100644 resources/utorrent/dopal/classes.py create mode 100644 resources/utorrent/dopal/classes.pyc create mode 100644 resources/utorrent/dopal/classes.pyo create mode 100644 resources/utorrent/dopal/convert.py create mode 100644 resources/utorrent/dopal/convert.pyc create mode 100644 resources/utorrent/dopal/convert.pyo create mode 100644 resources/utorrent/dopal/core.py create mode 100644 resources/utorrent/dopal/core.pyc create mode 100644 resources/utorrent/dopal/core.pyo create mode 100644 resources/utorrent/dopal/debug.py create mode 100644 resources/utorrent/dopal/debug.pyc create mode 100644 resources/utorrent/dopal/debug.pyo create mode 100644 resources/utorrent/dopal/errors.py create mode 100644 resources/utorrent/dopal/errors.pyc create mode 100644 resources/utorrent/dopal/errors.pyo create mode 100644 resources/utorrent/dopal/interact.py create mode 100644 resources/utorrent/dopal/interact.pyc create mode 100644 resources/utorrent/dopal/logutils.py create mode 100644 resources/utorrent/dopal/main.py create mode 100644 resources/utorrent/dopal/main.pyc create mode 100644 resources/utorrent/dopal/main.pyo create mode 100644 resources/utorrent/dopal/obj_impl.py create mode 100644 resources/utorrent/dopal/obj_impl.pyc create mode 100644 resources/utorrent/dopal/obj_impl.pyo create mode 100644 resources/utorrent/dopal/objects.py create mode 100644 resources/utorrent/dopal/objects.pyc create mode 100644 resources/utorrent/dopal/objects.pyo create mode 100644 resources/utorrent/dopal/persistency.py create mode 100644 resources/utorrent/dopal/scripting.py create mode 100644 resources/utorrent/dopal/utils.py create mode 100644 resources/utorrent/dopal/utils.pyc create mode 100644 resources/utorrent/dopal/utils.pyo create mode 100644 resources/utorrent/dopal/xmlutils.py create mode 100644 resources/utorrent/dopal/xmlutils.pyc create mode 100644 resources/utorrent/dopal/xmlutils.pyo create mode 100644 resources/utorrent/net.py create mode 100644 resources/utorrent/net.pyo diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..e206d70 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..5ca5e8e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..cf1ce12 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.idea/plugin.video.torrenter.iml b/.idea/plugin.video.torrenter.iml new file mode 100644 index 0000000..a34a857 --- /dev/null +++ b/.idea/plugin.video.torrenter.iml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml new file mode 100644 index 0000000..922003b --- /dev/null +++ b/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..275077f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..5cb2bf9 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1420801533300 + 1420801533300 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AceStream.py b/AceStream.py new file mode 100644 index 0000000..ea26dfa --- /dev/null +++ b/AceStream.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import time +import sys +import os +import urllib2 +import urllib +import hashlib +import re +import base64 +from StringIO import StringIO +import gzip +from functions import file_decode, file_encode + +from functions import magnet_alert +import xbmcvfs + + +class AceStream: + try: + fpath = os.path.expanduser("~") + pfile = os.path.join(fpath, 'AppData\Roaming\ACEStream\engine', 'acestream.port') + gf = open(pfile, 'r') + aceport = int(gf.read()) + gf.close() + print aceport + except: + aceport = 62062 + + torrentFile = None + magnetLink = None + storageDirectory = '' + torrentFilesDirectory = 'torrents' + startPart = 0 + endPart = 0 + partOffset = 0 + torrentHandle = None + session = None + downloadThread = None + threadComplete = False + lt = None + + def __init__(self, storageDirectory='', torrentFile='', torrentFilesDirectory='torrents'): + try: + from ASCore import TSengine as tsengine + + print 'Imported TSengine from ASCore' + except Exception, e: + print 'Error importing TSengine from ASCore. Exception: ' + str(e) + return + + + self.TSplayer = tsengine() + del tsengine + self.torrentFilesDirectory = torrentFilesDirectory + self.storageDirectory = storageDirectory + _path=os.path.join(self.storageDirectory, self.torrentFilesDirectory)+os.sep + if not xbmcvfs.exists(_path): + xbmcvfs.mkdirs(_path) + if xbmcvfs.exists(torrentFile): + self.torrentFile = torrentFile + content = xbmcvfs.File(torrentFile, "rb").read() + self.torrentFileInfo = self.TSplayer.load_torrent(base64.b64encode(content), 'RAW') + elif re.match("^magnet\:.+$", torrentFile): + magnet_alert() + exit() + + def __exit__(self): + self.TSplayer.end() + + def play_url_ind(self, ind, label, icon): + self.TSplayer.play_url_ind(int(ind), label, str(icon), '') + + def saveTorrent(self, torrentUrl): + if re.match("^magnet\:.+$", torrentUrl): + magnet_alert() + exit() + else: + torrentFile = self.storageDirectory + os.sep + self.torrentFilesDirectory + os.sep + self.md5( + torrentUrl) + '.torrent' + try: + if xbmcvfs.exists(file_decode(torrentUrl)): + content = xbmcvfs.File(file_decode(torrentUrl), "rb").read() + else: + request = urllib2.Request(torrentUrl) + request.add_header('Referer', torrentUrl) + request.add_header('Accept-encoding', 'gzip') + result = urllib2.urlopen(request) + if result.info().get('Content-Encoding') == 'gzip': + buf = StringIO(result.read()) + f = gzip.GzipFile(fileobj=buf) + content = f.read() + else: + content = result.read() + + localFile = xbmcvfs.File(torrentFile, "w+b") + localFile.write(content) + localFile.close() + except Exception, e: + print 'Unable to save torrent file from "' + torrentUrl + '" to "' + torrentFile + '" in AceStream::saveTorrent' + '. Exception: ' + str(e) + return + if xbmcvfs.exists(torrentFile): + self.torrentFile = torrentFile + self.torrentFileInfo = self.TSplayer.load_torrent(base64.b64encode(content), 'RAW') + return self.torrentFile + + def getMagnetInfo(self): + magnet_alert() + exit() + + def magnetToTorrent(self, magnet): + magnet_alert() + exit() + + def getFilePath(self, contentId=0): + fileList = self.getContentList() + for i in fileList: + if i['ind'] == contentId: + return os.path.join(file_encode(self.storageDirectory),i['title']) + + def getContentList(self): + filelist = [] + for k, v in self.TSplayer.files.iteritems(): + stringdata = {"title": urllib.unquote_plus(k), "ind": int(v)} + filelist.append(stringdata) + return filelist + + def md5(self, string): + hasher = hashlib.md5() + try: + hasher.update(string) + except: + hasher.update(string.encode('utf-8', 'ignore')) + return hasher.hexdigest() \ No newline at end of file diff --git a/AceStream.pyo b/AceStream.pyo new file mode 100644 index 0000000000000000000000000000000000000000..5214956c5fe017fe7dd1b90b05c1d263a028e2c3 GIT binary patch literal 6355 zcmcgwOLH5?5uOG35FoxpNrq_2)=07|a3oRjBT7n9RHmsH6PZ#Llxd-8qZZf!u+U-` z+8K~yigZ;h86*C$kcVqBk8^~rI4 zO4X;v^=Va~9@mel`Z1{&Ra{d2lB$=KH`=4D>ScL1q2lAJKcnh1sz0mhv-yZg>77&c zxq}(=sy?qmY=kwZ)t5@WQ0hs2fzsEiB_8UVf>LFTpN%xjOyW$Y2l22ICAytv`qPg- zUX{12>0mdDI$fu$tMBOde)R5p`ja4x`nvWs&61~r)wDtSrO-3tT(P<{)R0BuhGo21N@f}FKtK)!Bj^-|ZHwcGk z4K+ZgMBQ|NV|B4A4!RS?v2GeYw5C0bugF3`MsKcd+<*9ZL$9nq(VHv2zp}pZ_2)~yR)oy4NyTsS>b;`P0Q)0nbDzfumZbWmKjf=U<>i$P$tLmaeC!gfAw z27~%RCo!%O#3pl&{I^^ zo)8j13BLygogg997fA^9lTx0N^0eZ}*QBgSc}AHfRexRTXE~RDLMC5Av~wyfky7e! zsIV-RH&u9CD(6)=BNeT}S*cv$7U7)w5+Ywz;k z9W}i~43e)4e4YJ+749%63ZUS2aCvD*oJubMr{xWyYSJ|9G4r!UHG@X9f5?vokkgKv$Hr;u& zm8TNR+fiuJ<&o$n+d5#$<-x8<(P%_TFOfm||g)RxEyNj(lf!BJQq5d)#3w@8t}!ysEK za7sPJi7K8uC2wUb4n`QrIT@mZs}XQO&Ila`vLFOtwQ-ZDk)VJujE(m(3qhtbG82!D zoXIznpCF7aNf`T`=k4=CQKtA6gzE}ytAc1L>aQLu0J?Ej zO!S=Uy`kKjs&{^DnRDX+qh-KZRTC?v!>#`phudT59&>_E0}wX#P1|H37fxDfF(O2CqgxcZ3!}MiE44$3Svs+zs;rb99@K=hF;R)7MmY% zM+qV2;x&Yq)82&wgA2pUS@bV@^M#qhqBrZ!q34n}DPiZrD*_Ic3%Ytia(Z>dIk1NB zE8I|_uz`=|cEU7aA03tQrtlcmxb9y?DKXPUE;dzy0LmATl^$CT2$#2uo1f8BjmQfMN=qQc{4Ejh1}4ID3KK_`HVAgzwp%aM_ zCp8p==vW~S&=)DJpJ&=RQ%W8^Or8x>XBx;mt$zh`B$*BdV92n_HFC>k=;3Pk8kA%G zR1n`5Uc;pU;RGLnf+JOce;-18g~yUsl{e*`2hE(wy^}y3;Qk9V@_YzDGm}Aj0fQYU zhu&tQdE-Cm!-oYx4)cZeB5r&92*8(eO&x)33C7U1ul`gJiaH4{Yl4tacsHgX~;>+PE7Vbp9Bxd`%qU`%dG~PvwPqKEUTjd~3_Z#oN3Ii33Y>K%0?BDEAgzsZfM!u2#U5+G%RoW~wS$9%UKVzM@wyOu1*JwKOk2=D*LP9hNKRsRZEgWf2mFUDHd$yElKr4EN~5Ty x_AqJj8?VhXHeq%8YM#n*>7z$T%=u<+z_%D->^T%ug&7$B%fAa~y;eY3{5R`gl`;ST literal 0 HcmV?d00001 diff --git a/BeautifulSoup.py b/BeautifulSoup.py new file mode 100644 index 0000000..64999c9 --- /dev/null +++ b/BeautifulSoup.py @@ -0,0 +1,2049 @@ +"""Beautiful Soup +Elixir and Tonic +"The Screen-Scraper's Friend" +http://www.crummy.com/software/BeautifulSoup/ + +Beautiful Soup parses a (possibly invalid) XML or HTML document into a +tree representation. It provides methods and Pythonic idioms that make +it easy to navigate, search, and modify the tree. + +A well-formed XML/HTML document yields a well-formed data +structure. An ill-formed XML/HTML document yields a correspondingly +ill-formed data structure. If your document is only locally +well-formed, you can use this library to find and process the +well-formed part of it. + +Beautiful Soup works with Python 2.2 and up. It has no external +dependencies, but you'll have more success at converting data to UTF-8 +if you also install these three packages: + +* chardet, for auto-detecting character encodings + http://chardet.feedparser.org/ +* cjkcodecs and iconv_codec, which add more encodings to the ones supported + by stock Python. + http://cjkpython.i18n.org/ + +Beautiful Soup defines classes for two main parsing strategies: + + * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific + language that kind of looks like XML. + + * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid + or invalid. This class has web browser-like heuristics for + obtaining a sensible parse tree in the face of common HTML errors. + +Beautiful Soup also defines a class (UnicodeDammit) for autodetecting +the encoding of an HTML or XML document, and converting it to +Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser. + +For more than you ever wanted to know about Beautiful Soup, see the +documentation: +http://www.crummy.com/software/BeautifulSoup/documentation.html + +Here, have some legalese: + +Copyright (c) 2004-2010, Leonard Richardson + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the the Beautiful Soup Consortium and All + Night Kosher Bakery nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE, DAMMIT. + +""" +from __future__ import generators + +__author__ = "Leonard Richardson (leonardr@segfault.org)" +__version__ = "3.2.1" +__copyright__ = "Copyright (c) 2004-2012 Leonard Richardson" +__license__ = "New-style BSD" + +from sgmllib import SGMLParser, SGMLParseError +import codecs +import markupbase +import types +import re +import sgmllib + +try: + from htmlentitydefs import name2codepoint +except ImportError: + name2codepoint = {} +try: + set +except NameError: + from sets import Set as set + +# These hacks make Beautiful Soup able to parse XML with namespaces +sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') +markupbase._declname_match = re.compile(r'[a-zA-Z][-_.:a-zA-Z0-9]*\s*').match + +DEFAULT_OUTPUT_ENCODING = "utf-8" + + +def _match_css_class(str): + """Build a RE to match the given CSS class.""" + return re.compile(r"(^|.*\s)%s($|\s)" % str) + + +# First, the classes that represent markup elements. + +class PageElement(object): + """Contains the navigational information for some part of the page + (either a tag or a piece of text)""" + + def _invert(h): + "Cheap function to invert a hash." + i = {} + for k, v in h.items(): + i[v] = k + return i + + XML_ENTITIES_TO_SPECIAL_CHARS = {"apos": "'", + "quot": '"', + "amp": "&", + "lt": "<", + "gt": ">"} + + XML_SPECIAL_CHARS_TO_ENTITIES = _invert(XML_ENTITIES_TO_SPECIAL_CHARS) + + def setup(self, parent=None, previous=None): + """Sets up the initial relations between this element and + other elements.""" + self.parent = parent + self.previous = previous + self.next = None + self.previousSibling = None + self.nextSibling = None + if self.parent and self.parent.contents: + self.previousSibling = self.parent.contents[-1] + self.previousSibling.nextSibling = self + + def replaceWith(self, replaceWith): + oldParent = self.parent + myIndex = self.parent.index(self) + if hasattr(replaceWith, "parent") \ + and replaceWith.parent is self.parent: + # We're replacing this element with one of its siblings. + index = replaceWith.parent.index(replaceWith) + if index and index < myIndex: + # Furthermore, it comes before this element. That + # means that when we extract it, the index of this + # element will change. + myIndex = myIndex - 1 + self.extract() + oldParent.insert(myIndex, replaceWith) + + def replaceWithChildren(self): + myParent = self.parent + myIndex = self.parent.index(self) + self.extract() + reversedChildren = list(self.contents) + reversedChildren.reverse() + for child in reversedChildren: + myParent.insert(myIndex, child) + + def extract(self): + """Destructively rips this element out of the tree.""" + if self.parent: + try: + del self.parent.contents[self.parent.index(self)] + except ValueError: + pass + + #Find the two elements that would be next to each other if + #this element (and any children) hadn't been parsed. Connect + #the two. + lastChild = self._lastRecursiveChild() + nextElement = lastChild.next + + if self.previous: + self.previous.next = nextElement + if nextElement: + nextElement.previous = self.previous + self.previous = None + lastChild.next = None + + self.parent = None + if self.previousSibling: + self.previousSibling.nextSibling = self.nextSibling + if self.nextSibling: + self.nextSibling.previousSibling = self.previousSibling + self.previousSibling = self.nextSibling = None + return self + + def _lastRecursiveChild(self): + "Finds the last element beneath this object to be parsed." + lastChild = self + while hasattr(lastChild, 'contents') and lastChild.contents: + lastChild = lastChild.contents[-1] + return lastChild + + def insert(self, position, newChild): + if isinstance(newChild, basestring) \ + and not isinstance(newChild, NavigableString): + newChild = NavigableString(newChild) + + position = min(position, len(self.contents)) + if hasattr(newChild, 'parent') and newChild.parent is not None: + # We're 'inserting' an element that's already one + # of this object's children. + if newChild.parent is self: + index = self.index(newChild) + if index > position: + # Furthermore we're moving it further down the + # list of this object's children. That means that + # when we extract this element, our target index + # will jump down one. + position = position - 1 + newChild.extract() + + newChild.parent = self + previousChild = None + if position == 0: + newChild.previousSibling = None + newChild.previous = self + else: + previousChild = self.contents[position - 1] + newChild.previousSibling = previousChild + newChild.previousSibling.nextSibling = newChild + newChild.previous = previousChild._lastRecursiveChild() + if newChild.previous: + newChild.previous.next = newChild + + newChildsLastElement = newChild._lastRecursiveChild() + + if position >= len(self.contents): + newChild.nextSibling = None + + parent = self + parentsNextSibling = None + while not parentsNextSibling: + parentsNextSibling = parent.nextSibling + parent = parent.parent + if not parent: # This is the last element in the document. + break + if parentsNextSibling: + newChildsLastElement.next = parentsNextSibling + else: + newChildsLastElement.next = None + else: + nextChild = self.contents[position] + newChild.nextSibling = nextChild + if newChild.nextSibling: + newChild.nextSibling.previousSibling = newChild + newChildsLastElement.next = nextChild + + if newChildsLastElement.next: + newChildsLastElement.next.previous = newChildsLastElement + self.contents.insert(position, newChild) + + def append(self, tag): + """Appends the given tag to the contents of this tag.""" + self.insert(len(self.contents), tag) + + def findNext(self, name=None, attrs={}, text=None, **kwargs): + """Returns the first item that matches the given criteria and + appears after this Tag in the document.""" + return self._findOne(self.findAllNext, name, attrs, text, **kwargs) + + def findAllNext(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns all items that match the given criteria and appear + after this Tag in the document.""" + return self._findAll(name, attrs, text, limit, self.nextGenerator, + **kwargs) + + def findNextSibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this Tag that matches the + given criteria and appears after this Tag in the document.""" + return self._findOne(self.findNextSiblings, name, attrs, text, + **kwargs) + + def findNextSiblings(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns the siblings of this Tag that match the given + criteria and appear after this Tag in the document.""" + return self._findAll(name, attrs, text, limit, + self.nextSiblingGenerator, **kwargs) + + fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x + + def findPrevious(self, name=None, attrs={}, text=None, **kwargs): + """Returns the first item that matches the given criteria and + appears before this Tag in the document.""" + return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs) + + def findAllPrevious(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Returns all items that match the given criteria and appear + before this Tag in the document.""" + return self._findAll(name, attrs, text, limit, self.previousGenerator, + **kwargs) + + fetchPrevious = findAllPrevious # Compatibility with pre-3.x + + def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this Tag that matches the + given criteria and appears before this Tag in the document.""" + return self._findOne(self.findPreviousSiblings, name, attrs, text, + **kwargs) + + def findPreviousSiblings(self, name=None, attrs={}, text=None, + limit=None, **kwargs): + """Returns the siblings of this Tag that match the given + criteria and appear before this Tag in the document.""" + return self._findAll(name, attrs, text, limit, + self.previousSiblingGenerator, **kwargs) + + fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x + + def findParent(self, name=None, attrs={}, **kwargs): + """Returns the closest parent of this Tag that matches the given + criteria.""" + # NOTE: We can't use _findOne because findParents takes a different + # set of arguments. + r = None + l = self.findParents(name, attrs, 1) + if l: + r = l[0] + return r + + def findParents(self, name=None, attrs={}, limit=None, **kwargs): + """Returns the parents of this Tag that match the given + criteria.""" + + return self._findAll(name, attrs, None, limit, self.parentGenerator, + **kwargs) + + fetchParents = findParents # Compatibility with pre-3.x + + #These methods do the real heavy lifting. + + def _findOne(self, method, name, attrs, text, **kwargs): + r = None + l = method(name, attrs, text, 1, **kwargs) + if l: + r = l[0] + return r + + def _findAll(self, name, attrs, text, limit, generator, **kwargs): + "Iterates over a generator looking for things that match." + + if isinstance(name, SoupStrainer): + strainer = name + # (Possibly) special case some findAll*(...) searches + elif text is None and not limit and not attrs and not kwargs: + # findAll*(True) + if name is True: + return [element for element in generator() + if isinstance(element, Tag)] + # findAll*('tag-name') + elif isinstance(name, basestring): + return [element for element in generator() + if isinstance(element, Tag) and + element.name == name] + else: + strainer = SoupStrainer(name, attrs, text, **kwargs) + # Build a SoupStrainer + else: + strainer = SoupStrainer(name, attrs, text, **kwargs) + results = ResultSet(strainer) + g = generator() + while True: + try: + i = g.next() + except StopIteration: + break + if i: + found = strainer.search(i) + if found: + results.append(found) + if limit and len(results) >= limit: + break + return results + + #These Generators can be used to navigate starting from both + #NavigableStrings and Tags. + def nextGenerator(self): + i = self + while i is not None: + i = i.next + yield i + + def nextSiblingGenerator(self): + i = self + while i is not None: + i = i.nextSibling + yield i + + def previousGenerator(self): + i = self + while i is not None: + i = i.previous + yield i + + def previousSiblingGenerator(self): + i = self + while i is not None: + i = i.previousSibling + yield i + + def parentGenerator(self): + i = self + while i is not None: + i = i.parent + yield i + + # Utility methods + def substituteEncoding(self, str, encoding=None): + encoding = encoding or "utf-8" + return str.replace("%SOUP-ENCODING%", encoding) + + def toEncoding(self, s, encoding=None): + """Encodes an object to a string in some encoding, or to Unicode. + .""" + if isinstance(s, unicode): + if encoding: + s = s.encode(encoding) + elif isinstance(s, str): + if encoding: + s = s.encode(encoding) + else: + s = unicode(s) + else: + if encoding: + s = self.toEncoding(str(s), encoding) + else: + s = unicode(s) + return s + + BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|" + + "&(?!#\d+;|#x[0-9a-fA-F]+;|\w+;)" + + ")") + + def _sub_entity(self, x): + """Used with a regular expression to substitute the + appropriate XML entity for an XML special character.""" + return "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";" + + +class NavigableString(unicode, PageElement): + def __new__(cls, value): + """Create a new NavigableString. + + When unpickling a NavigableString, this method is called with + the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be + passed in to the superclass's __new__ or the superclass won't know + how to handle non-ASCII characters. + """ + if isinstance(value, unicode): + return unicode.__new__(cls, value) + return unicode.__new__(cls, value, DEFAULT_OUTPUT_ENCODING) + + def __getnewargs__(self): + return (NavigableString.__str__(self),) + + def __getattr__(self, attr): + """text.string gives you text. This is for backwards + compatibility for Navigable*String, but for CData* it lets you + get the string without the CData wrapper.""" + if attr == 'string': + return self + else: + raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr) + + def __unicode__(self): + return str(self).decode(DEFAULT_OUTPUT_ENCODING) + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + # Substitute outgoing XML entities. + data = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, self) + if encoding: + return data.encode(encoding) + else: + return data + + +class CData(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + + +class ProcessingInstruction(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + output = self + if "%SOUP-ENCODING%" in output: + output = self.substituteEncoding(output, encoding) + return "" % self.toEncoding(output, encoding) + + +class Comment(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + + +class Declaration(NavigableString): + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING): + return "" % NavigableString.__str__(self, encoding) + + +class Tag(PageElement): + """Represents a found HTML tag with its attributes and contents.""" + + def _convertEntities(self, match): + """Used in a call to re.sub to replace HTML, XML, and numeric + entities with the appropriate Unicode characters. If HTML + entities are being converted, any unrecognized entities are + escaped.""" + x = match.group(1) + if self.convertHTMLEntities and x in name2codepoint: + return unichr(name2codepoint[x]) + elif x in self.XML_ENTITIES_TO_SPECIAL_CHARS: + if self.convertXMLEntities: + return self.XML_ENTITIES_TO_SPECIAL_CHARS[x] + else: + return u'&%s;' % x + elif len(x) > 0 and x[0] == '#': + # Handle numeric entities + if len(x) > 1 and x[1] == 'x': + return unichr(int(x[2:], 16)) + else: + return unichr(int(x[1:])) + + elif self.escapeUnrecognizedEntities: + return u'&%s;' % x + else: + return u'&%s;' % x + + def __init__(self, parser, name, attrs=None, parent=None, + previous=None): + "Basic constructor." + + # We don't actually store the parser object: that lets extracted + # chunks be garbage-collected + self.parserClass = parser.__class__ + self.isSelfClosing = parser.isSelfClosingTag(name) + self.name = name + if attrs is None: + attrs = [] + elif isinstance(attrs, dict): + attrs = attrs.items() + self.attrs = attrs + self.contents = [] + self.setup(parent, previous) + self.hidden = False + self.containsSubstitutions = False + self.convertHTMLEntities = parser.convertHTMLEntities + self.convertXMLEntities = parser.convertXMLEntities + self.escapeUnrecognizedEntities = parser.escapeUnrecognizedEntities + + # Convert any HTML, XML, or numeric entities in the attribute values. + convert = lambda (k, val): (k, + re.sub("&(#\d+|#x[0-9a-fA-F]+|\w+);", + self._convertEntities, + val)) + self.attrs = map(convert, self.attrs) + + def getString(self): + if (len(self.contents) == 1 + and isinstance(self.contents[0], NavigableString)): + return self.contents[0] + + def setString(self, string): + """Replace the contents of the tag with a string""" + self.clear() + self.append(string) + + string = property(getString, setString) + + def getText(self, separator=u""): + if not len(self.contents): + return u"" + stopNode = self._lastRecursiveChild().next + strings = [] + current = self.contents[0] + while current is not stopNode: + if isinstance(current, NavigableString): + strings.append(current.strip()) + current = current.next + return separator.join(strings) + + text = property(getText) + + def get(self, key, default=None): + """Returns the value of the 'key' attribute for the tag, or + the value given for 'default' if it doesn't have that + attribute.""" + return self._getAttrMap().get(key, default) + + def clear(self): + """Extract all children.""" + for child in self.contents[:]: + child.extract() + + def index(self, element): + for i, child in enumerate(self.contents): + if child is element: + return i + raise ValueError("Tag.index: element not in tag") + + def has_key(self, key): + return self._getAttrMap().has_key(key) + + def __getitem__(self, key): + """tag[key] returns the value of the 'key' attribute for the tag, + and throws an exception if it's not there.""" + return self._getAttrMap()[key] + + def __iter__(self): + "Iterating over a tag iterates over its contents." + return iter(self.contents) + + def __len__(self): + "The length of a tag is the length of its list of contents." + return len(self.contents) + + def __contains__(self, x): + return x in self.contents + + def __nonzero__(self): + "A tag is non-None even if it has no contents." + return True + + def __setitem__(self, key, value): + """Setting tag[key] sets the value of the 'key' attribute for the + tag.""" + self._getAttrMap() + self.attrMap[key] = value + found = False + for i in range(0, len(self.attrs)): + if self.attrs[i][0] == key: + self.attrs[i] = (key, value) + found = True + if not found: + self.attrs.append((key, value)) + self._getAttrMap()[key] = value + + def __delitem__(self, key): + "Deleting tag[key] deletes all 'key' attributes for the tag." + for item in self.attrs: + if item[0] == key: + self.attrs.remove(item) + #We don't break because bad HTML can define the same + #attribute multiple times. + self._getAttrMap() + if self.attrMap.has_key(key): + del self.attrMap[key] + + def __call__(self, *args, **kwargs): + """Calling a tag like a function is the same as calling its + findAll() method. Eg. tag('a') returns a list of all the A tags + found within this tag.""" + return apply(self.findAll, args, kwargs) + + def __getattr__(self, tag): + #print "Getattr %s.%s" % (self.__class__, tag) + if len(tag) > 3 and tag.rfind('Tag') == len(tag) - 3: + return self.find(tag[:-3]) + elif tag.find('__') != 0: + return self.find(tag) + raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__, tag) + + def __eq__(self, other): + """Returns true iff this tag has the same name, the same attributes, + and the same contents (recursively) as the given tag. + + NOTE: right now this will return false if two tags have the + same attributes in a different order. Should this be fixed?""" + if other is self: + return True + if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, + 'contents') or self.name != other.name or self.attrs != other.attrs or len( + self) != len(other): + return False + for i in range(0, len(self.contents)): + if self.contents[i] != other.contents[i]: + return False + return True + + def __ne__(self, other): + """Returns true iff this tag is not identical to the other tag, + as defined in __eq__.""" + return not self == other + + def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING): + """Renders this tag as a string.""" + return self.__str__(encoding) + + def __unicode__(self): + return self.__str__(None) + + def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Returns a string or Unicode representation of this tag and + its contents. To get Unicode, pass None for encoding. + + NOTE: since Python's HTML parser consumes whitespace, this + method is not certain to reproduce the whitespace present in + the original string.""" + + encodedName = self.toEncoding(self.name, encoding) + + attrs = [] + if self.attrs: + for key, val in self.attrs: + fmt = '%s="%s"' + if isinstance(val, basestring): + if self.containsSubstitutions and '%SOUP-ENCODING%' in val: + val = self.substituteEncoding(val, encoding) + + # The attribute value either: + # + # * Contains no embedded double quotes or single quotes. + # No problem: we enclose it in double quotes. + # * Contains embedded single quotes. No problem: + # double quotes work here too. + # * Contains embedded double quotes. No problem: + # we enclose it in single quotes. + # * Embeds both single _and_ double quotes. This + # can't happen naturally, but it can happen if + # you modify an attribute value after parsing + # the document. Now we have a bit of a + # problem. We solve it by enclosing the + # attribute in single quotes, and escaping any + # embedded single quotes to XML entities. + if '"' in val: + fmt = "%s='%s'" + if "'" in val: + # replace with apos when + # appropriate. + val = val.replace("'", "&squot;") + + # Now we're okay w/r/t quotes. But the attribute + # value might also contain angle brackets, or + # ampersands that aren't part of entities. We need + # to escape those to XML entities too. + val = self.BARE_AMPERSAND_OR_BRACKET.sub(self._sub_entity, val) + + attrs.append(fmt % (self.toEncoding(key, encoding), + self.toEncoding(val, encoding))) + close = '' + closeTag = '' + if self.isSelfClosing: + close = ' /' + else: + closeTag = '' % encodedName + + indentTag, indentContents = 0, 0 + if prettyPrint: + indentTag = indentLevel + space = (' ' * (indentTag - 1)) + indentContents = indentTag + 1 + contents = self.renderContents(encoding, prettyPrint, indentContents) + if self.hidden: + s = contents + else: + s = [] + attributeString = '' + if attrs: + attributeString = ' ' + ' '.join(attrs) + if prettyPrint: + s.append(space) + s.append('<%s%s%s>' % (encodedName, attributeString, close)) + if prettyPrint: + s.append("\n") + s.append(contents) + if prettyPrint and contents and contents[-1] != "\n": + s.append("\n") + if prettyPrint and closeTag: + s.append(space) + s.append(closeTag) + if prettyPrint and closeTag and self.nextSibling: + s.append("\n") + s = ''.join(s) + return s + + def decompose(self): + """Recursively destroys the contents of this tree.""" + self.extract() + if len(self.contents) == 0: + return + current = self.contents[0] + while current is not None: + next = current.next + if isinstance(current, Tag): + del current.contents[:] + current.parent = None + current.previous = None + current.previousSibling = None + current.next = None + current.nextSibling = None + current = next + + def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING): + return self.__str__(encoding, True) + + def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING, + prettyPrint=False, indentLevel=0): + """Renders the contents of this tag as a string in the given + encoding. If encoding is None, returns a Unicode string..""" + s = [] + for c in self: + text = None + if isinstance(c, NavigableString): + text = c.__str__(encoding) + elif isinstance(c, Tag): + s.append(c.__str__(encoding, prettyPrint, indentLevel)) + if text and prettyPrint: + text = text.strip() + if text: + if prettyPrint: + s.append(" " * (indentLevel - 1)) + s.append(text) + if prettyPrint: + s.append("\n") + return ''.join(s) + + #Soup methods + + def find(self, name=None, attrs={}, recursive=True, text=None, + **kwargs): + """Return only the first child of this Tag matching the given + criteria.""" + r = None + l = self.findAll(name, attrs, recursive, text, 1, **kwargs) + if l: + r = l[0] + return r + + findChild = find + + def findAll(self, name=None, attrs={}, recursive=True, text=None, + limit=None, **kwargs): + """Extracts a list of Tag objects that match the given + criteria. You can specify the name of the Tag and any + attributes you want the Tag to have. + + The value of a key-value pair in the 'attrs' map can be a + string, a list of strings, a regular expression object, or a + callable that takes a string and returns whether or not the + string matches for some custom definition of 'matches'. The + same is true of the tag name.""" + generator = self.recursiveChildGenerator + if not recursive: + generator = self.childGenerator + return self._findAll(name, attrs, text, limit, generator, **kwargs) + + findChildren = findAll + + # Pre-3.x compatibility methods + first = find + fetch = findAll + + def fetchText(self, text=None, recursive=True, limit=None): + return self.findAll(text=text, recursive=recursive, limit=limit) + + def firstText(self, text=None, recursive=True): + return self.find(text=text, recursive=recursive) + + #Private methods + + def _getAttrMap(self): + """Initializes a map representation of this tag's attributes, + if not already initialized.""" + if not getattr(self, 'attrMap'): + self.attrMap = {} + for (key, value) in self.attrs: + self.attrMap[key] = value + return self.attrMap + + #Generator methods + def childGenerator(self): + # Just use the iterator from the contents + return iter(self.contents) + + def recursiveChildGenerator(self): + if not len(self.contents): + raise StopIteration + stopNode = self._lastRecursiveChild().next + current = self.contents[0] + while current is not stopNode: + yield current + current = current.next + + +# Next, a couple classes to represent queries and their results. +class SoupStrainer: + """Encapsulates a number of ways of matching a markup element (tag or + text).""" + + def __init__(self, name=None, attrs={}, text=None, **kwargs): + self.name = name + if isinstance(attrs, basestring): + kwargs['class'] = _match_css_class(attrs) + attrs = None + if kwargs: + if attrs: + attrs = attrs.copy() + attrs.update(kwargs) + else: + attrs = kwargs + self.attrs = attrs + self.text = text + + def __str__(self): + if self.text: + return self.text + else: + return "%s|%s" % (self.name, self.attrs) + + def searchTag(self, markupName=None, markupAttrs={}): + found = None + markup = None + if isinstance(markupName, Tag): + markup = markupName + markupAttrs = markup + callFunctionWithTagData = callable(self.name) \ + and not isinstance(markupName, Tag) + + if (not self.name) \ + or callFunctionWithTagData \ + or (markup and self._matches(markup, self.name)) \ + or (not markup and self._matches(markupName, self.name)): + if callFunctionWithTagData: + match = self.name(markupName, markupAttrs) + else: + match = True + markupAttrMap = None + for attr, matchAgainst in self.attrs.items(): + if not markupAttrMap: + if hasattr(markupAttrs, 'get'): + markupAttrMap = markupAttrs + else: + markupAttrMap = {} + for k, v in markupAttrs: + markupAttrMap[k] = v + attrValue = markupAttrMap.get(attr) + if not self._matches(attrValue, matchAgainst): + match = False + break + if match: + if markup: + found = markup + else: + found = markupName + return found + + def search(self, markup): + #print 'looking for %s in %s' % (self, markup) + found = None + # If given a list of items, scan it for a text element that + # matches. + if hasattr(markup, "__iter__") \ + and not isinstance(markup, Tag): + for element in markup: + if isinstance(element, NavigableString) \ + and self.search(element): + found = element + break + # If it's a Tag, make sure its name or attributes match. + # Don't bother with Tags if we're searching for text. + elif isinstance(markup, Tag): + if not self.text: + found = self.searchTag(markup) + # If it's text, make sure the text matches. + elif isinstance(markup, NavigableString) or \ + isinstance(markup, basestring): + if self._matches(markup, self.text): + found = markup + else: + raise Exception, "I don't know how to match against a %s" \ + % markup.__class__ + return found + + def _matches(self, markup, matchAgainst): + #print "Matching %s against %s" % (markup, matchAgainst) + result = False + if matchAgainst is True: + result = markup is not None + elif callable(matchAgainst): + result = matchAgainst(markup) + else: + #Custom match methods take the tag as an argument, but all + #other ways of matching match the tag name as a string. + if isinstance(markup, Tag): + markup = markup.name + if markup and not isinstance(markup, basestring): + markup = unicode(markup) + #Now we know that chunk is either a string, or None. + if hasattr(matchAgainst, 'match'): + # It's a regexp object. + result = markup and matchAgainst.search(markup) + elif hasattr(matchAgainst, '__iter__'): # list-like + result = markup in matchAgainst + elif hasattr(matchAgainst, 'items'): + result = markup.has_key(matchAgainst) + elif matchAgainst and isinstance(markup, basestring): + if isinstance(markup, unicode): + matchAgainst = unicode(matchAgainst) + else: + matchAgainst = str(matchAgainst) + + if not result: + result = matchAgainst == markup + return result + + +class ResultSet(list): + """A ResultSet is just a list that keeps track of the SoupStrainer + that created it.""" + + def __init__(self, source): + list.__init__([]) + self.source = source + + +# Now, some helper functions. + +def buildTagMap(default, *args): + """Turns a list of maps, lists, or scalars into a single map. + Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and + NESTING_RESET_TAGS maps out of lists and partial maps.""" + built = {} + for portion in args: + if hasattr(portion, 'items'): + #It's a map. Merge it. + for k, v in portion.items(): + built[k] = v + elif hasattr(portion, '__iter__'): # is a list + #It's a list. Map each item to the default. + for k in portion: + built[k] = default + else: + #It's a scalar. Map it to the default. + built[portion] = default + return built + + +# Now, the parser classes. + +class BeautifulStoneSoup(Tag, SGMLParser): + """This class contains the basic parser and search code. It defines + a parser that knows nothing about tag behavior except for the + following: + + You can't close a tag without closing all the tags it encloses. + That is, "" actually means + "". + + [Another possible explanation is "", but since + this class defines no SELF_CLOSING_TAGS, it will never use that + explanation.] + + This class is useful for parsing XML or made-up markup languages, + or when BeautifulSoup makes an assumption counter to what you were + expecting.""" + + SELF_CLOSING_TAGS = {} + NESTABLE_TAGS = {} + RESET_NESTING_TAGS = {} + QUOTE_TAGS = {} + PRESERVE_WHITESPACE_TAGS = [] + + MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'), + lambda x: x.group(1) + ' />'), + (re.compile(']*)>'), + lambda x: '') + ] + + ROOT_TAG_NAME = u'[document]' + + HTML_ENTITIES = "html" + XML_ENTITIES = "xml" + XHTML_ENTITIES = "xhtml" + # This only exists for backwards-compatibility + ALL_ENTITIES = XHTML_ENTITIES + + # Used when determining whether a text node is all whitespace and + # can be replaced with a single space. A text node that contains + # fancy Unicode spaces (usually non-breaking) should be left + # alone. + STRIP_ASCII_SPACES = {9: None, 10: None, 12: None, 13: None, 32: None, } + + def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None, + markupMassage=True, smartQuotesTo=XML_ENTITIES, + convertEntities=None, selfClosingTags=None, isHTML=False): + """The Soup object is initialized as the 'root tag', and the + provided markup (which can be a string or a file-like object) + is fed into the underlying parser. + + sgmllib will process most bad HTML, and the BeautifulSoup + class has some tricks for dealing with some HTML that kills + sgmllib, but Beautiful Soup can nonetheless choke or lose data + if your data uses self-closing tags or declarations + incorrectly. + + By default, Beautiful Soup uses regexes to sanitize input, + avoiding the vast majority of these problems. If the problems + don't apply to you, pass in False for markupMassage, and + you'll get better performance. + + The default parser massage techniques fix the two most common + instances of invalid HTML that choke sgmllib: + +
(No space between name of closing tag and tag close) + (Extraneous whitespace in declaration) + + You can pass in a custom list of (RE object, replace method) + tuples to get Beautiful Soup to scrub your input the way you + want.""" + + self.parseOnlyThese = parseOnlyThese + self.fromEncoding = fromEncoding + self.smartQuotesTo = smartQuotesTo + self.convertEntities = convertEntities + # Set the rules for how we'll deal with the entities we + # encounter + if self.convertEntities: + # It doesn't make sense to convert encoded characters to + # entities even while you're converting entities to Unicode. + # Just convert it all to Unicode. + self.smartQuotesTo = None + if convertEntities == self.HTML_ENTITIES: + self.convertXMLEntities = False + self.convertHTMLEntities = True + self.escapeUnrecognizedEntities = True + elif convertEntities == self.XHTML_ENTITIES: + self.convertXMLEntities = True + self.convertHTMLEntities = True + self.escapeUnrecognizedEntities = False + elif convertEntities == self.XML_ENTITIES: + self.convertXMLEntities = True + self.convertHTMLEntities = False + self.escapeUnrecognizedEntities = False + else: + self.convertXMLEntities = False + self.convertHTMLEntities = False + self.escapeUnrecognizedEntities = False + + self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags) + SGMLParser.__init__(self) + + if hasattr(markup, 'read'): # It's a file-type object. + markup = markup.read() + self.markup = markup + self.markupMassage = markupMassage + try: + self._feed(isHTML=isHTML) + except StopParsing: + pass + self.markup = None # The markup can now be GCed + + def convert_charref(self, name): + """This method fixes a bug in Python's SGMLParser.""" + try: + n = int(name) + except ValueError: + return + if not 0 <= n <= 127: # ASCII ends at 127, not 255 + return + return self.convert_codepoint(n) + + def _feed(self, inDocumentEncoding=None, isHTML=False): + # Convert the document to Unicode. + markup = self.markup + if isinstance(markup, unicode): + if not hasattr(self, 'originalEncoding'): + self.originalEncoding = None + else: + dammit = UnicodeDammit \ + (markup, [self.fromEncoding, inDocumentEncoding], + smartQuotesTo=self.smartQuotesTo, isHTML=isHTML) + markup = dammit.unicode + self.originalEncoding = dammit.originalEncoding + self.declaredHTMLEncoding = dammit.declaredHTMLEncoding + if markup: + if self.markupMassage: + if not hasattr(self.markupMassage, "__iter__"): + self.markupMassage = self.MARKUP_MASSAGE + for fix, m in self.markupMassage: + markup = fix.sub(m, markup) + # We get rid of markupMassage so that the + # soup object can be deepcopied later on. Some + # Python installations can't copy regexes. If anyone + # was relying on the existence of markupMassage, this + # might cause problems. + del (self.markupMassage) + self.reset() + + SGMLParser.feed(self, markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while self.currentTag.name != self.ROOT_TAG_NAME: + self.popTag() + + def __getattr__(self, methodName): + """This method routes method call requests to either the SGMLParser + superclass or the Tag superclass, depending on the method name.""" + #print "__getattr__ called on %s.%s" % (self.__class__, methodName) + + if methodName.startswith('start_') or methodName.startswith('end_') \ + or methodName.startswith('do_'): + return SGMLParser.__getattr__(self, methodName) + elif not methodName.startswith('__'): + return Tag.__getattr__(self, methodName) + else: + raise AttributeError + + def isSelfClosingTag(self, name): + """Returns true iff the given string is the name of a + self-closing tag according to this parser.""" + return self.SELF_CLOSING_TAGS.has_key(name) \ + or self.instanceSelfClosingTags.has_key(name) + + def reset(self): + Tag.__init__(self, self, self.ROOT_TAG_NAME) + self.hidden = 1 + SGMLParser.reset(self) + self.currentData = [] + self.currentTag = None + self.tagStack = [] + self.quoteStack = [] + self.pushTag(self) + + def popTag(self): + tag = self.tagStack.pop() + + #print "Pop", tag.name + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag): + #print "Push", tag.name + if self.currentTag: + self.currentTag.contents.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + + def endData(self, containerClass=NavigableString): + if self.currentData: + currentData = u''.join(self.currentData) + if (currentData.translate(self.STRIP_ASCII_SPACES) == '' and + not set([tag.name for tag in self.tagStack]).intersection( + self.PRESERVE_WHITESPACE_TAGS)): + if '\n' in currentData: + currentData = '\n' + else: + currentData = ' ' + self.currentData = [] + if self.parseOnlyThese and len(self.tagStack) <= 1 and \ + (not self.parseOnlyThese.text or \ + not self.parseOnlyThese.search(currentData)): + return + o = containerClass(currentData) + o.setup(self.currentTag, self.previous) + if self.previous: + self.previous.next = o + self.previous = o + self.currentTag.contents.append(o) + + + def _popToTag(self, name, inclusivePop=True): + """Pops the tag stack up to and including the most recent + instance of the given tag. If inclusivePop is false, pops the tag + stack up to but *not* including the most recent instqance of + the given tag.""" + #print "Popping to %s" % name + if name == self.ROOT_TAG_NAME: + return + + numPops = 0 + mostRecentTag = None + for i in range(len(self.tagStack) - 1, 0, -1): + if name == self.tagStack[i].name: + numPops = len(self.tagStack) - i + break + if not inclusivePop: + numPops = numPops - 1 + + for i in range(0, numPops): + mostRecentTag = self.popTag() + return mostRecentTag + + def _smartPop(self, name): + + """We need to pop up to the previous tag of this type, unless + one of this tag's nesting reset triggers comes between this + tag and the previous tag of this type, OR unless this tag is a + generic nesting trigger and another generic nesting trigger + comes between this tag and the previous tag of this type. + + Examples: +

FooBar *

* should pop to 'p', not 'b'. +

FooBar *

* should pop to 'table', not 'p'. +

Foo

Bar *

* should pop to 'tr', not 'p'. + +

    • *
    • * should pop to 'ul', not the first 'li'. +
  • ** should pop to 'table', not the first 'tr' + tag should + implicitly close the previous tag within the same
    ** should pop to 'tr', not the first 'td' + """ + + nestingResetTriggers = self.NESTABLE_TAGS.get(name) + isNestable = nestingResetTriggers != None + isResetNesting = self.RESET_NESTING_TAGS.has_key(name) + popTo = None + inclusive = True + for i in range(len(self.tagStack) - 1, 0, -1): + p = self.tagStack[i] + if (not p or p.name == name) and not isNestable: + #Non-nestable tags get popped to the top or to their + #last occurance. + popTo = name + break + if (nestingResetTriggers is not None + and p.name in nestingResetTriggers) \ + or (nestingResetTriggers is None and isResetNesting + and self.RESET_NESTING_TAGS.has_key(p.name)): + #If we encounter one of the nesting reset triggers + #peculiar to this tag, or we encounter another tag + #that causes nesting to reset, pop up to but not + #including that tag. + popTo = p.name + inclusive = False + break + p = p.parent + if popTo: + self._popToTag(popTo, inclusive) + + def unknown_starttag(self, name, attrs, selfClosing=0): + #print "Start tag %s: %s" % (name, attrs) + if self.quoteStack: + #This is not a real tag. + #print "<%s> is not real!" % name + attrs = ''.join([' %s="%s"' % (x, y) for x, y in attrs]) + self.handle_data('<%s%s>' % (name, attrs)) + return + self.endData() + + if not self.isSelfClosingTag(name) and not selfClosing: + self._smartPop(name) + + if self.parseOnlyThese and len(self.tagStack) <= 1 \ + and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)): + return + + tag = Tag(self, name, attrs, self.currentTag, self.previous) + if self.previous: + self.previous.next = tag + self.previous = tag + self.pushTag(tag) + if selfClosing or self.isSelfClosingTag(name): + self.popTag() + if name in self.QUOTE_TAGS: + #print "Beginning quote (%s)" % name + self.quoteStack.append(name) + self.literal = 1 + return tag + + def unknown_endtag(self, name): + #print "End tag %s" % name + if self.quoteStack and self.quoteStack[-1] != name: + #This is not a real end tag. + #print " is not real!" % name + self.handle_data('' % name) + return + self.endData() + self._popToTag(name) + if self.quoteStack and self.quoteStack[-1] == name: + self.quoteStack.pop() + self.literal = (len(self.quoteStack) > 0) + + def handle_data(self, data): + self.currentData.append(data) + + def _toStringSubclass(self, text, subclass): + """Adds a certain piece of text to the tree as a NavigableString + subclass.""" + self.endData() + self.handle_data(text) + self.endData(subclass) + + def handle_pi(self, text): + """Handle a processing instruction as a ProcessingInstruction + object, possibly one with a %SOUP-ENCODING% slot into which an + encoding will be plugged later.""" + if text[:3] == "xml": + text = u"xml version='1.0' encoding='%SOUP-ENCODING%'" + self._toStringSubclass(text, ProcessingInstruction) + + def handle_comment(self, text): + "Handle comments as Comment objects." + self._toStringSubclass(text, Comment) + + def handle_charref(self, ref): + "Handle character references as data." + if self.convertEntities: + data = unichr(int(ref)) + else: + data = '&#%s;' % ref + self.handle_data(data) + + def handle_entityref(self, ref): + """Handle entity references as data, possibly converting known + HTML and/or XML entity references to the corresponding Unicode + characters.""" + data = None + if self.convertHTMLEntities: + try: + data = unichr(name2codepoint[ref]) + except KeyError: + pass + + if not data and self.convertXMLEntities: + data = self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref) + + if not data and self.convertHTMLEntities and \ + not self.XML_ENTITIES_TO_SPECIAL_CHARS.get(ref): + # We've got a problem here. We're told this is + # an entity reference, but it's not an XML entity + # reference or an HTML entity reference. Nonetheless, + # the logical thing to do is to pass it through as an + # unrecognized entity reference. + # + # Except: when the input is "&carol;" this function + # will be called with input "carol". When the input is + # "AT&T", this function will be called with input + # "T". We have no way of knowing whether a semicolon + # was present originally, so we don't know whether + # this is an unknown entity or just a misplaced + # ampersand. + # + # The more common case is a misplaced ampersand, so I + # escape the ampersand and omit the trailing semicolon. + data = "&%s" % ref + if not data: + # This case is different from the one above, because we + # haven't already gone through a supposedly comprehensive + # mapping of entities to Unicode characters. We might not + # have gone through any mapping at all. So the chances are + # very high that this is a real entity, and not a + # misplaced ampersand. + data = "&%s;" % ref + self.handle_data(data) + + def handle_decl(self, data): + "Handle DOCTYPEs and the like as Declaration objects." + self._toStringSubclass(data, Declaration) + + def parse_declaration(self, i): + """Treat a bogus SGML declaration as raw data. Treat a CDATA + declaration as a CData object.""" + j = None + if self.rawdata[i:i + 9] == '', i) + if k == -1: + k = len(self.rawdata) + data = self.rawdata[i + 9:k] + j = k + 3 + self._toStringSubclass(data, CData) + else: + try: + j = SGMLParser.parse_declaration(self, i) + except SGMLParseError: + toHandle = self.rawdata[i:] + self.handle_data(toHandle) + j = i + len(toHandle) + return j + + +class BeautifulSoup(BeautifulStoneSoup): + """This parser knows the following facts about HTML: + + * Some tags have no closing tag and should be interpreted as being + closed as soon as they are encountered. + + * The text inside some tags (ie. 'script') may contain tags which + are not really part of the document and which should be parsed + as text, not tags. If you want to parse the text as tags, you can + always fetch it and parse it explicitly. + + * Tag nesting rules: + + Most tags can't be nested at all. For instance, the occurance of + a

    tag should implicitly close the previous

    tag. + +

    Para1

    Para2 + should be transformed into: +

    Para1

    Para2 + + Some tags can be nested arbitrarily. For instance, the occurance + of a

    tag should _not_ implicitly close the previous +
    tag. + + Alice said:
    Bob said:
    Blah + should NOT be transformed into: + Alice said:
    Bob said:
    Blah + + Some tags can be nested, but the nesting is reset by the + interposition of other tags. For instance, a
    , + but not close a tag in another table. + +
    BlahBlah + should be transformed into: +
    BlahBlah + but, + Blah
    Blah + should NOT be transformed into + Blah
    Blah + + Differing assumptions about tag nesting rules are a major source + of problems with the BeautifulSoup class. If BeautifulSoup is not + treating as nestable a tag your page author treats as nestable, + try ICantBelieveItsBeautifulSoup, MinimalSoup, or + BeautifulStoneSoup before writing your own subclass.""" + + def __init__(self, *args, **kwargs): + if not kwargs.has_key('smartQuotesTo'): + kwargs['smartQuotesTo'] = self.HTML_ENTITIES + kwargs['isHTML'] = True + BeautifulStoneSoup.__init__(self, *args, **kwargs) + + SELF_CLOSING_TAGS = buildTagMap(None, + ('br', 'hr', 'input', 'img', 'meta', + 'spacer', 'link', 'frame', 'base', 'col')) + + PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea']) + + QUOTE_TAGS = {'script': None, 'textarea': None} + + #According to the HTML standard, each of these inline tags can + #contain another tag of the same type. Furthermore, it's common + #to actually use these tags this way. + NESTABLE_INLINE_TAGS = ('span', 'font', 'q', 'object', 'bdo', 'sub', 'sup', + 'center') + + #According to the HTML standard, these block tags can contain + #another tag of the same type. Furthermore, it's common + #to actually use these tags this way. + NESTABLE_BLOCK_TAGS = ('blockquote', 'div', 'fieldset', 'ins', 'del') + + #Lists can contain other lists, but there are restrictions. + NESTABLE_LIST_TAGS = {'ol': [], + 'ul': [], + 'li': ['ul', 'ol'], + 'dl': [], + 'dd': ['dl'], + 'dt': ['dl']} + + #Tables can contain other tables, but there are restrictions. + NESTABLE_TABLE_TAGS = {'table': [], + 'tr': ['table', 'tbody', 'tfoot', 'thead'], + 'td': ['tr'], + 'th': ['tr'], + 'thead': ['table'], + 'tbody': ['table'], + 'tfoot': ['table'], + } + + NON_NESTABLE_BLOCK_TAGS = ('address', 'form', 'p', 'pre') + + #If one of these tags is encountered, all tags up to the next tag of + #this type are popped. + RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript', + NON_NESTABLE_BLOCK_TAGS, + NESTABLE_LIST_TAGS, + NESTABLE_TABLE_TAGS) + + NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS, + NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS) + + # Used to detect the charset in a META tag; see start_meta + CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)", re.M) + + def start_meta(self, attrs): + """Beautiful Soup can detect a charset included in a META tag, + try to convert the document to that charset, and re-parse the + document from the beginning.""" + httpEquiv = None + contentType = None + contentTypeIndex = None + tagNeedsEncodingSubstitution = False + + for i in range(0, len(attrs)): + key, value = attrs[i] + key = key.lower() + if key == 'http-equiv': + httpEquiv = value + elif key == 'content': + contentType = value + contentTypeIndex = i + + if httpEquiv and contentType: # It's an interesting meta tag. + match = self.CHARSET_RE.search(contentType) + if match: + if (self.declaredHTMLEncoding is not None or + self.originalEncoding == self.fromEncoding): + # An HTML encoding was sniffed while converting + # the document to Unicode, or an HTML encoding was + # sniffed during a previous pass through the + # document, or an encoding was specified + # explicitly and it worked. Rewrite the meta tag. + def rewrite(match): + return match.group(1) + "%SOUP-ENCODING%" + + newAttr = self.CHARSET_RE.sub(rewrite, contentType) + attrs[contentTypeIndex] = (attrs[contentTypeIndex][0], + newAttr) + tagNeedsEncodingSubstitution = True + else: + # This is our first pass through the document. + # Go through it again with the encoding information. + newCharset = match.group(3) + if newCharset and newCharset != self.originalEncoding: + self.declaredHTMLEncoding = newCharset + self._feed(self.declaredHTMLEncoding) + raise StopParsing + pass + tag = self.unknown_starttag("meta", attrs) + if tag and tagNeedsEncodingSubstitution: + tag.containsSubstitutions = True + + +class StopParsing(Exception): + pass + + +class ICantBelieveItsBeautifulSoup(BeautifulSoup): + """The BeautifulSoup class is oriented towards skipping over + common HTML errors like unclosed tags. However, sometimes it makes + errors of its own. For instance, consider this fragment: + + FooBar + + This is perfectly valid (if bizarre) HTML. However, the + BeautifulSoup class will implicitly close the first b tag when it + encounters the second 'b'. It will think the author wrote + "FooBar", and didn't close the first 'b' tag, because + there's no real-world reason to bold something that's already + bold. When it encounters '' it will close two more 'b' + tags, for a grand total of three tags closed instead of two. This + can throw off the rest of your document structure. The same is + true of a number of other tags, listed below. + + It's much more common for someone to forget to close a 'b' tag + than to actually use nested 'b' tags, and the BeautifulSoup class + handles the common case. This class handles the not-co-common + case: where you can't believe someone wrote what they did, but + it's valid HTML and BeautifulSoup screwed up by assuming it + wouldn't be.""" + + I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \ + ('em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong', + 'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b', + 'big') + + I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ('noscript',) + + NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS, + I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS, + I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS) + + +class MinimalSoup(BeautifulSoup): + """The MinimalSoup class is for parsing HTML that contains + pathologically bad markup. It makes no assumptions about tag + nesting, but it does know which tags are self-closing, that + ').findall(ok)[-1] + post = '{"jsonrpc":"2.0","method":"ToggleFriendship","id":1,"params":{"userId":274684,"add":1,"__token":"' + token + '"}}' + Debug('[friend_xbmc]: token is %s' % (token)) + ok = post_url_json(cookie_auth, __rpcurl__, post) + if ok or not ok: + try: + fw = xbmcvfs.File(filename, 'w') + except: + fw = open(filename, 'w') + fw.write(str(ok)) + fw.close() + return True + else: + return False + except: + Debug('[friend_xbmc] Something went wrong!') + return False + + +def ontop(action='get', ontop=None): + from torrents import prefix + + if action in ('update'): + if ontop: + jdata = json.loads(Data(cookie_auth, __baseurl__ + '/profile/shows/').get()) + jstringdata = json.loads(ontop) + showId = str(jstringdata['showId']) + pre = prefix(showId=int(showId), seasonId=jstringdata['seasonId']) + # if ruName=='true' and jdata[showId]['ruTitle']: title=pre+jdata[showId]['ruTitle'] + # else: + title = pre + jdata[showId]['title'] + if jstringdata['seasonId']: + mode = "25" + title += ' Season ' + str(jstringdata['seasonId']) + else: + mode = "20" + ontop = {'title': title, 'mode': mode, 'argv': {'stringdata': ontop}} + #print unicode(ontop) + __settings__.setSetting("ontop", str(ontop).encode('utf-8')) + elif action == 'get': + x = __settings__.getSetting("ontop") + if x != "None" and x: + y = {} + y['mode'] = re.compile("'%s': '(\d+)'" % ('mode')).findall(x)[0] + y['argv'] = {} + y['argv']['stringdata'] = re.compile("{'%s': '(.+?)'}" % ('stringdata')).findall(x)[0] + y['argv']['showId'] = re.compile('"%s": (\d+),' % ('showId')).findall(y['argv']['stringdata'])[0] + try: + y['argv']['seasonNumber'] = re.compile('"%s": (\d+),' % ('seasonId')).findall(y['argv']['stringdata'])[ + 0] + except: + pass + y['title'] = re.compile("'%s': u'(.+?)'" % ('title')).findall(x)[0].encode('utf-8') + # print unicode(y) + return y + else: + return None + + +def getDirList(path, newl=None): + l = [] + try: + if not newl: dirs, newl = xbmcvfs.listdir(path) + except: + try: + if not newl: dirs, newl = xbmcvfs.listdir(path.decode('utf-8').encode('cp1251')) + except: + showMessage(__language__(30206), __language__(30280), forced=True) + return l + for fl in newl: + match = re.match('.avi|.mp4|.mkV|.flv|.mov|.vob|.wmv|.ogm|.asx|.mpg|mpeg|.avc|.vp3|.fli|.flc|.m4v', + fl[int(len(fl)) - 4:len(fl)], re.I) + if match: + l.append(fl) + return l + + +def cutFileNames(l): + from difflib import Differ + + d = Differ() + + text = sortext(l) + newl = [] + for li in l: newl.append(cutStr(li[0:len(li) - 1 - len(li.split('.')[-1])])) + l = newl + + text1 = cutStr(text[0][0:len(text[0]) - 1 - len(text[0].split('.')[-1])]) + text2 = cutStr(text[1][0:len(text[1]) - 1 - len(text[1].split('.')[-1])]) + sep_file = " " + result = list(d.compare(text1.split(sep_file), text2.split(sep_file))) + Debug('[cutFileNames] ' + unicode(result)) + + start = '' + end = '' + + for res in result: + if str(res).startswith('-') or str(res).startswith('+') or str(res).startswith('.?'): + break + start = start + str(res).strip() + sep_file + result.reverse() + for res in result: + if str(res).startswith('-') or str(res).startswith('+') or str(res).startswith('?'): + break + end = sep_file + str(res).strip() + end + + newl = l + l = [] + Debug('[cutFileNames] [start] ' + start) + Debug('[cutFileNames] [end] ' + end) + for fl in newl: + if cutStr(fl[0:len(start)]) == cutStr(start): fl = fl[len(start):] + if cutStr(fl[len(fl) - len(end):]) == cutStr(end): fl = fl[0:len(fl) - len(end)] + try: + isinstance(int(fl.split(sep_file)[0]), int) + fl = fl.split(sep_file)[0] + except: + pass + l.append(fl) + Debug('[cutFileNames] [sorted l] ' + unicode(sorted(l, key=lambda x: x)), True) + return l + + +def cutStr(s): + return s.replace('.', ' ').replace('_', ' ').replace('[', ' ').replace(']', ' ').lower().strip() + + +def sortext(filelist): + result = {} + for name in filelist: + ext = name.split('.')[-1] + try: + result[ext] = result[ext] + 1 + except: + result[ext] = 1 + lol = result.iteritems() + lol = sorted(lol, key=lambda x: x[1]) + Debug('[sortext]: lol:' + str(lol)) + popext = lol[-1][0] + result, i = [], 0 + for name in filelist: + if name.split('.')[-1] == popext: + result.append(name) + i = i + 1 + result = sweetpair(result) + Debug('[sortext]: result:' + str(result)) + return result + + +def sweetpair(l): + from difflib import SequenceMatcher + + s = SequenceMatcher() + ratio = [] + for i in range(0, len(l)): ratio.append(0) + for i in range(0, len(l)): + for p in range(0, len(l)): + s.set_seqs(l[i], l[p]) + ratio[i] = ratio[i] + s.quick_ratio() + id1, id2 = 0, 0 + for i in range(0, len(l)): + if ratio[id1] <= ratio[i] and i != id2 or id2 == id1 and ratio[id1] == ratio[i]: + id2 = id1 + id1 = i + # Debug('1 - %d %d' % (id1, id2)) + elif (ratio[id2] <= ratio[i] or id1 == id2) and i != id1: + id2 = i + # Debug('2 - %d %d' % (id1, id2)) + + Debug('[sweetpair]: id1 ' + l[id1] + ':' + str(ratio[id1])) + Debug('[sweetpair]: id2 ' + l[id2] + ':' + str(ratio[id2])) + + return [l[id1], l[id2]] + + +def FileNamesPrepare(filename): + my_season = None + my_episode = None + + try: + if int(filename): + my_episode = int(filename) + Debug('[FileNamesPrepare] ' + str([my_season, my_episode, filename])) + return [my_season, my_episode, filename] + except: + pass + + urls = ['s(\d+)e(\d+)', '(\d+)[x|-](\d+)', 'E(\d+)', 'Ep(\d+)', '\((\d+)\)'] + for file in urls: + match = re.compile(file, re.DOTALL | re.I | re.IGNORECASE).findall(filename) + if match: + try: + my_episode = int(match[1]) + my_season = int(match[0]) + except: + try: + my_episode = int(match[0]) + except: + try: + my_episode = int(match[0][1]) + my_season = int(match[0][0]) + except: + try: + my_episode = int(match[0][0]) + except: + break + if my_season and my_season > 100: my_season = None + if my_episode and my_episode > 365: my_episode = None + Debug('[FileNamesPrepare] ' + str([my_season, my_episode, filename])) + return [my_season, my_episode, filename] + + +def filename2match(filename, no_date=False): + results = {'label': filename} + urls = ['(.+|.?)s(\d+)e(\d+)', '(.+|.?)s(\d+)\.e(\d+)', '(.+|.?) [\[|\(](\d+)[x|-](\d+)[\]|\)]', + '(.+|.?) (\d+)[x|-](\d+)'] # same in service + for file in urls: + match = re.compile(file, re.I | re.IGNORECASE).findall(filename) + # print str(results) + if match: + results['showtitle'], results['season'], results['episode'] = match[0] + results['showtitle'] = results['showtitle'].replace('.', ' ').replace('_', ' ').strip().replace( + 'The Daily Show', 'The Daily Show With Jon Stewart') + results['season'], results['episode'] = int(results['season']), int(results['episode']) + # Debug('[filename2match] '+str(results)) + return results + if no_date: return + urls = ['(.+)(\d{4})\.(\d{2,4})\.(\d{2,4})', '(.+)(\d{4}) (\d{2}) (\d{2})'] # same in service + for file in urls: + match = re.compile(file, re.I | re.IGNORECASE).findall(filename) + if match: + results['showtitle'] = match[0][0].replace('.', ' ').strip().replace('The Daily Show', + 'The Daily Show With Jon Stewart') + results['date'] = '%s.%s.%s' % (match[0][3], match[0][2], match[0][1]) + Debug('[filename2match] ' + str(results)) + return results + + +def TextBB(string, action=None, color=None): + if action == 'b': + string = '[B]' + string + '[/B]' + return string + + +def jstr(s): + if not s: + s = 'null' + elif not unicode(s).isnumeric(): + s = '"%s"' % (s) + return str(s) + + +def view_style(func): + styles = {} + num_skin, style = 0, 'info' + view_style = int(__settings__.getSetting("skin_optimization")) + if view_style in [3, 2]: + styles['searchOption'] = styles['History'] = styles['List'] = 'info' + styles['drawContent'] = styles['drawtrackerList'] = styles['drawcontentList'] = 'info' + styles['sectionMenu'] = styles['Seasons'] = 'list' + styles['uTorrentBrowser'] = styles['torrentPlayer'] = styles['openTorrent'] = 'wide' + styles['showFilesList'] = 'wide' + elif view_style in [1, 4]: + styles['searchOption'] = 'info' + styles['drawContent'] = styles['torrentPlayer'] = styles['openTorrent'] = styles['drawtrackerList'] = 'info' + styles['uTorrentBrowser'] = styles['History'] = 'wide' + styles['showFilesList'] = styles['sectionMenu'] = 'wide' + styles['List'] = styles['drawcontentList'] = 'info3' + + if view_style == 1: + styles['uTorrentBrowser'] = styles['torrentPlayer'] = styles['openTorrent'] = styles['History'] = 'wide' + styles['sectionMenu'] = 'icons' + + if view_style in [1, 3, 4]: + num_skin = 0 + elif view_style == 2: + num_skin = 1 + + style = styles.get(func) + # Debug('[view_style]: lock '+str(style)) + lockView(style, num_skin) + + +def lockView(viewId='info', num_skin=0): + xbmcplugin.setContent(int(sys.argv[1]), 'movies') + skinOptimizations = ( + {'list': 50, 'info': 50, 'wide': 51, 'icons': 500, 'info3': 515, }, # Confluence + {'list': 50, 'info': 51, 'wide': 52, 'icons': 53, } # Transperency! + ) + try: + xbmc.executebuiltin("Container.SetViewMode(%s)" % str(skinOptimizations[num_skin][viewId])) + except: + return + + ''' + PosterWrapView2_Fanart + MediaListView3 + MediaListView2 + MediaListView4 + WideIconView + MusicVideoInfoListView + AddonInfoListView1 + AddonInfoThumbView1 + LiveTVView1 + ''' + + +def torrent_dir(): + from resources.utorrent.net import Download + + socket.setdefaulttimeout(3) + list = Download().list() + ret = 0 + if list and len(list) > 0: + dirs = ["Keyboard"] + for dl in list: + if dl['dir'] not in dirs: + dirs.append(dl['dir']) + basename = os.path.dirname(dl['dir']) + if basename not in dirs: + dirs.append(basename) + else: + dirs.remove(basename) + dirs.insert(1, basename) + + dialog = xbmcgui.Dialog() + ret = dialog.select(Localization.localize('Manual Torrent-client Path Edit'), dirs) + else: + ret = 0 + + if ret == 0: + KB = xbmc.Keyboard() + KB.setHeading(Localization.localize('Manual Torrent-client Path Edit')) + KB.setDefault(__settings__.getSetting("torrent_dir")) + KB.doModal() + if (KB.isConfirmed()): + __settings__.setSetting("torrent_dir", KB.getText()) + elif ret > 0: + __settings__.setSetting("torrent_dir", dirs[ret]) + + +def saveCheckPoint(): + __settings__.setSetting("checkpoint", str(sys.argv[2])) + + +def gotoCheckPoint(): + xbmc.executebuiltin( + 'XBMC.ActivateWindow(Videos,plugin://plugin.video.myshows/%s)' % (__settings__.getSetting("checkpoint"))) + + +def smbtopath(path): + x = path.split('@') + if len(x) > 1: + path = x[1] + else: + path = path.replace('smb://', '') + Debug('[smbtopath]:' + '\\\\' + path.replace('/', '\\')) + return '\\\\' + path.replace('/', '\\') + + +def PrepareFilename(filename): + badsymb = [':', '"', '\\', '/', '\'', '!', ['&', 'and'], '*', '?', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', + ' ', ' '] + for b in badsymb: + if not isinstance(b, list): + filename = filename.replace(b, ' ') + else: + filename = filename.replace(b[0], b[1]) + return filename.rstrip('. ') + + +def PrepareSearch(filename): + titles = [filename] + rstr = '. -' + badsymb = [':', '"', r'\\', '/', r'\'', '!', '&', '*', '_', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + ' ', ' '] + for b in badsymb: + filename = filename.replace(b, ' ') + + filename = re.sub("\([^)]*\)([^(]*)", "\\1", filename) + filename = re.sub("\[[^\]]*\]([^\[]*)", "\\1", filename) + filename = filename.strip().rstrip(rstr) + + if titles[0] != filename and filename != '': titles.insert(0, filename) + + title_array = [(u'(.+?)(Cезон|cезон|Сезон|сезон|Season|season|СЕЗОН|SEASON)', titles[0], 0), + (u'(.+?)[sS](\d{1,2})', titles[0].replace('.', ' '), 0), + ] + for regex, title, i in title_array: + recomp = re.compile(regex) + match = recomp.findall(title) + if match: + titles.insert(0, match[0][i].rstrip(rstr)) + + return titles + + +def kinorate(title, year, titleAlt=None, kinopoiskId=None): + if kinopoiskId: + match = {'title': title.replace('"', ''), 'year': str(year), 'kinopoiskId': str(kinopoiskId)} + else: + match = {'title': title.replace('"', ''), 'year': str(year)} + if titleAlt: + match['titleAlt'] = titleAlt.replace('"', '') + try: + xbmc.executebuiltin( + 'xbmc.RunScript(' + xbmcaddon.Addon("script.myshows").getAddonInfo("path") + os.sep + + 'sync_exec.py,' + json.dumps(match).replace(',', '|:|') + ')') + except: + return False + + +class RateShow(): + def __init__(self, showId, watched_jdata=None): + self.dialog = xbmcgui.Dialog() + self.showId = showId + self.list = {} + if watched_jdata: + self.watched_jdata = watched_jdata + else: + watched_data = Data(cookie_auth, __baseurl__ + '/profile/shows/' + str(showId) + '/', + __baseurl__ + '/profile/shows/' + str(showId) + '/') + try: + self.watched_jdata = json.loads(watched_data.get()) + except: + Debug('[RateShow] no watched_jdata1') + return + if not self.watched_jdata: + Debug('[RateShow] no watched_jdata2') + return + + def seasonrates(self): + jload = Data(cookie_auth, __baseurl__ + '/profile/shows/').get() + jshowdata = json.loads(jload) + if str(self.showId) in jshowdata: + self.list, seasonNumber = self.listSE(jshowdata[str(self.showId)]['totalEpisodes']) + ratedict = {} + for i in self.list: + for j in self.list[i]: + if self.watched_jdata.has_key(j): + if self.watched_jdata[j]['rating']: + if ratedict.has_key(i): + ratedict[i].append(self.watched_jdata[j]['rating']) + else: + ratedict[i] = [self.watched_jdata[j]['rating']] + # Debug('[ratedict]:'+str(ratedict)) + for i in ratedict: + ratedict[i] = (round(float(sum(ratedict[i])) / len(ratedict[i]), 2), len(ratedict[i])) + Debug('[ratedict]:' + str(ratedict)) + else: + ratedict = {} + return ratedict + + def count(self): + ratings, seasonratings = [], [] + showId = str(self.showId) + jload = Data(cookie_auth, __baseurl__ + '/profile/shows/').get() + jshowdata = json.loads(jload) + self.list, seasonNumber = self.listSE(jshowdata[showId]['totalEpisodes']) + old_rating = jshowdata[showId]['rating'] + for id in self.watched_jdata: + if self.watched_jdata[id]['rating']: + ratings.append(self.watched_jdata[id]['rating']) + if id in self.list[str(seasonNumber)]: + seasonratings.append(self.watched_jdata[id]['rating']) + # Debug('ratings:'+str(ratings)+'; seasonratings:'+str(seasonratings)) + if len(ratings) > 0: + rating = round(float(sum(ratings)) / len(ratings), 2) + else: + rating = 0 + if len(seasonratings) > 0: + seasonrating = round(float(sum(seasonratings)) / len(seasonratings), 2) + else: + seasonrating = 0 + return rating, seasonNumber, seasonrating, old_rating + + def listSE(self, maxep): + listSE, seasonNumber = {}, 0 + data = Data(cookie_auth, __baseurl__ + '/shows/' + str(self.showId)) + jdata = json.loads(data.get()) + for id in jdata['episodes']: + if maxep >= jdata['episodes'][id]['sequenceNumber']: + if listSE.has_key(str(jdata['episodes'][id]['seasonNumber'])): + listSE[str(jdata['episodes'][id]['seasonNumber'])].append(id) + else: + listSE[str(jdata['episodes'][id]['seasonNumber'])] = [id] + if jdata['episodes'][id]['seasonNumber'] > seasonNumber: + seasonNumber = jdata['episodes'][id]['seasonNumber'] + # Debug('[listSE] '+str(listSE)+str(seasonNumber)) + return listSE, seasonNumber + + +def isRemoteTorr(): + localhost = ['127.0.0.1', '0.0.0.0', 'localhost'] + if __settings__.getSetting("torrent") == '0': + if __settings__.getSetting("torrent_utorrent_host") not in localhost: + Debug('[isRemoteTorr]: uTorrent is Remote!') + return True + elif __settings__.getSetting("torrent") == '1': + if __settings__.getSetting("torrent_transmission_host") not in localhost: + Debug('[isRemoteTorr]: Transmission is Remote!') + return True + + +def changeDBTitle(showId): + from utilities import xbmcJsonRequest + + shows = xbmcJsonRequest( + {'jsonrpc': '2.0', 'method': 'VideoLibrary.GetTVShows', 'params': {'properties': ['title']}, 'id': 0}) + + if not shows: + Debug('[changeDBTitle]: XBMC JSON Result was empty.') + return + + if 'tvshows' in shows: + shows = shows['tvshows'] + Debug("[changeDBTitle]: XBMC JSON Result: '%s'" % str(shows)) + else: + Debug("[changeDBTitle]: Key 'tvshows' not found") + return + + if len(shows) > 0: + newtitle = id2title(showId, None, True)[0].decode('utf-8', 'ignore') + dialog = xbmcgui.Dialog() + dialog_items, dialog_ids = [__language__(30205)], [-1] + shows = sorted(shows, key=lambda x: x['tvshowid'], reverse=True) + for show in shows: + dialog_ids.append(show['tvshowid']) + dialog_items.append(show['title']) + + ret = dialog.select(newtitle, dialog_items) + if ret > 0: + ok = dialog.yesno(__language__(30322), __language__(30534), + __language__(30535) % (dialog_items[ret], newtitle)) + if ok: + result = xbmcJsonRequest({'jsonrpc': '2.0', 'method': 'VideoLibrary.SetTVShowDetails', + 'params': {'tvshowid': int(dialog_ids[ret]), 'title': unicode(newtitle)}, + 'id': 1}) + if result in [newtitle, 'OK']: + showMessage(__language__(30208), __language__(30536) % (newtitle), forced=True) + else: + Debug("[changeDBTitle]: XBMC JSON Result: '%s'" % str(result)) + return + + +class TimeOut(): + def __init__(self): + self.scan = CacheDB('web_timeout') + self.gone_online = CacheDB('go_online') + self.get = self.scan.get() + self.online = 30 + self.offline = 1 + + def go_offline(self, manual=False): + gone_online = self.gone_online.get() + if gone_online: + gone_online = int(gone_online) + else: + gone_online = 0 + if not manual: + if gone_online and gone_online + self.online >= int(round(time.time())): + Debug('[TimeOut]: too soon to go back offline! %d s' % ( + (gone_online + self.online * 4) - int(round(time.time())))) + return + if self.timeout() == self.online: + Debug('[TimeOut]: Gone offline! %d s' % ((gone_online + self.online * 4) - int(round(time.time())))) + showMessage(__language__(30520), __language__(30545) % (self.offline)) + if self.get: self.scan.delete() + self.scan.add() + + def go_online(self): + if self.get: + self.scan.delete() + Debug('[TimeOut]: Gone online!') + showMessage(__language__(30521), __language__(30545) % (self.online)) + if self.gone_online.get(): + self.gone_online.delete() + self.gone_online.add() + + def timeout(self): + if self.get and int(time.time()) - self.get < refresh_period * 3600: + to = self.offline + else: + to = self.online + # Debug('[TimeOut]: '+str(to)) + return to + +class ListDB: + def __init__(self, version=1.0): + self.dbname = 'list' + '.db3' + dirname = xbmc.translatePath('special://temp') + self.dbfilename = os.path.join(dirname, 'xbmcup', + __settings__.getAddonInfo('id').replace('plugin://', '').replace('/', ''), + self.dbname) + self.version = version + if not xbmcvfs.exists(self.dbfilename): + self.creat_db() + + def creat_db(self): + self._connect() + self.cur.execute('pragma auto_vacuum=1') + self.cur.execute('create table db_ver(version real)') + # self.cur.execute('create table list(addtime integer PRIMARY KEY, title varchar(32), originaltitle varchar(32)' + # ', year integer, category varchar(32), subcategory varchar(32))') + self.cur.execute('create table list(addtime integer PRIMARY KEY, info varchar(32))') + self.cur.execute('insert into db_ver(version) values(?)', (self.version, )) + self.db.commit() + self._close() + + def ClearCache(self, silent=False): + self._connect() + self.cur.execute('delete from cache') + self.db.commit() + self._close() + if not silent: + xbmcgui.Dialog().ok(__language__(30208), __language__(30236)) + ontop('update') + xbmc.executebuiltin("Action(back)") + + def get(self, addtime): + self._connect() + self.cur.execute('select info from list where addtime="' + addtime + '"') + x = self.cur.fetchone() + self._close() + return x[0] if x else None + + def get_all(self): + self._connect() + # self.cur.execute('select addtime,title,originaltitle,year,category,subcategory from list') + self.cur.execute('select addtime,info from list') + x = self.cur.fetchall() + self._close() + return x if x else None + + def add(self, url): + self._connect() + self.cur.execute('insert into list(addtime,info)' + ' values(?,?)', (int(time.time()), url)) + self.db.commit() + self._close() + + def delete(self, addtime): + self._connect() + self.cur.execute('delete from list where addtime="' + addtime + '"') + self.db.commit() + self._close() + + def _connect(self): + self.db = sqlite.connect(self.dbfilename) + self.cur = self.db.cursor() + + def _close(self): + self.cur.close() + self.db.close() + + +class HistoryDB: + def __init__(self, name, version=1.0): + self.name = name + '.db3' + self.version = version + + def get_all(self): + self._connect() + self.cur.execute('select addtime,string,fav from history order by addtime DESC') + x = self.cur.fetchall() + self._close() + return x if x else None + + def get(self, url): + self._connect() + self.cur.execute('select string from history where string="' + url + '"') + x = self.cur.fetchone() + self._close() + return x[0] if x else None + + def get_providers(self, addtime): + self._connect() + self.cur.execute('select providers from history where addtime="' + addtime + '"') + x = self.cur.fetchone() + self._close() + #print 'get_providers: '+str(x[0].split(',') if x and x[0]!='' else None) + return x[0].split(',') if x and x[0]!='' else None + + def set_providers(self, addtime, providers): + self._connect() + if isinstance(providers, dict): + temp=[] + for i in providers.keys(): + if providers.get(i): + temp.append(i) + providers=temp + str_p=','.join(providers) + self.cur.execute('UPDATE history SET providers = "' + str_p + '" where addtime=' + addtime) + self.db.commit() + self._close() + + def change_providers(self, addtime, searcher): + self._connect() + providers=self.get_providers(addtime) + keys=Searchers().dic().keys() + if searcher in providers: + providers.remove(searcher) + else: + providers.append(searcher) + for i in providers: + if i not in keys: + providers.remove(i) + self.set_providers(addtime, providers) + self.db.commit() + self._close() + + def add(self, url): + try: + url = url.decode('utf-8') + except: + pass + if not self.get(url): + self._connect() + self.cur.execute('insert into history(addtime,string,fav,providers)' + ' values(?,?,?,?)', (int(time.time()), url, 0, "")) + self.db.commit() + self._close() + + def update(self, addtime, fav): + self._connect() + self.cur.execute('UPDATE history SET fav = ' + str(fav) + ' where addtime=' + addtime) + self.db.commit() + self._close() + + def fav(self, addtime): + self.update(addtime, fav=1) + + def unfav(self, addtime): + self.update(addtime, fav=0) + + def delete(self, addtime): + self._connect() + self.cur.execute('delete from history where addtime="' + addtime + '"') + self.db.commit() + self._close() + + def clear(self): + self._connect() + self.cur.execute('delete from history where fav=0') + self.db.commit() + self._close() + + def _connect(self): + dirname = xbmc.translatePath('special://temp') + for subdir in ('xbmcup', 'plugin.video.torrenter'): + dirname = os.path.join(dirname, subdir) + if not xbmcvfs.exists(dirname): + xbmcvfs.mkdir(dirname) + + self.filename = os.path.join(dirname, self.name) + + first = False + if not xbmcvfs.exists(self.filename): + first = True + + self.db = sqlite.connect(self.filename, check_same_thread=False) + if not first: + self.cur = self.db.cursor() + try: + self.cur.execute('select version from db_ver') + row = self.cur.fetchone() + if not row or float(row[0]) != self.version: + self.cur.execute('drop table history') + self.cur.execute('drop table if exists db_ver') + first = True + self.db.commit() + self.cur.close() + except: + self.cur.execute('drop table history') + first = True + self.db.commit() + self.cur.close() + + if first: + cur = self.db.cursor() + cur.execute('pragma auto_vacuum=1') + cur.execute('create table db_ver(version real)') + cur.execute( + 'create table history(addtime integer PRIMARY KEY, string varchar(32), providers varchar(32), fav integer)') + cur.execute('insert into db_ver(version) values(?)', (self.version, )) + self.db.commit() + cur.close() + self.cur = self.db.cursor() + + def _close(self): + self.cur.close() + self.db.close() + +class Searchers(): + def __init__(self): + pass + + def getBoolSetting(self, setting): + return __settings__.getSetting(setting).lower() == "true" + + def setBoolSetting(self, setting, bool=True): + __settings__.setSetting(setting, "true" if bool else "false") + + def list(self): + searchersList = [] + dirList = os.listdir(ROOT + os.sep + 'resources' + os.sep + 'searchers') + for searcherFile in dirList: + if re.match('^(\w+)\.py$', searcherFile): + searchersList.append(searcherFile.replace('.py', '')) + return searchersList + + def dic(self, providers=[]): + dic = {} + for searcher in self.list(): + if not providers: + dic[searcher] = self.old(searcher) + else: + dic[searcher] = searcher in providers + return dic + + def old(self, searcher): + if not self.getBoolSetting('old_' + searcher): + self.setBoolSetting('old_' + searcher) + self.setBoolSetting(searcher) + return self.getBoolSetting(searcher) + + def get_active(self): + get_active = [] + for searcher in self.list(): + if self.old(searcher): get_active.append(searcher + '.py') + print 'Active Searchers: '+str(get_active) + return get_active + + +class Contenters(): + def __init__(self): + pass + + def first_time(self, scrapperDB_ver, language='ru'): + searcher = 'metadata'+language + redl = False + scrapperDB_ver=scrapperDB_ver[language] + if scrapperDB_ver != __settings__.getSetting('scrapperDB_ver'+language) and self.getBoolSetting(searcher): + __settings__.setSetting('scrapperDB_ver'+language, scrapperDB_ver) + ok = xbmcgui.Dialog().yesno('< %s >' % Localization.localize('Content Lists'), + Localization.localize('Your preloaded databases are outdated!'), + Localization.localize('Do you want to download new ones right now?')) + if ok: + dirname = xbmc.translatePath('special://temp') + dirname = os.path.join(dirname, 'xbmcup', 'plugin.video.torrenter') + scrapers = {'tvdb': 'TheTVDB.com', 'tmdb': 'TheMovieDB.org', 'kinopoisk': 'KinoPoisk.ru'} + for i in scrapers.keys(): + xbmcvfs.delete(os.path.join(dirname, i+'.'+language + '.db')) + showMessage(Localization.localize('Reset All Cache DBs'), Localization.localize('Deleted!')) + redl = True + else: + xbmcgui.Dialog().ok('< %s >' % Localization.localize('Content Lists'), + Localization.localize( + 'You can always restart this by deleting DBs via Context Menu'), ) + + if not self.getBoolSetting('oldc_' + searcher): + self.setBoolSetting('oldc_' + searcher, True) + __settings__.setSetting('scrapperDB_ver'+language, scrapperDB_ver) + ok = xbmcgui.Dialog().yesno('< %s >' % Localization.localize('Content Lists'), + Localization.localize('Do you want to search and cache full metadata + arts?'), + Localization.localize( + 'This vastly decreases load speed, but you will be asked to download premade bases!')) + if ok: + self.setBoolSetting(searcher, True) + redl = True + else: + self.setBoolSetting(searcher, False) + + if redl: + self.Scraper = Scrapers() + scrapers = {'tvdb': 'TheTVDB.com', 'tmdb': 'TheMovieDB.org', 'kinopoisk': 'KinoPoisk.ru'} + for scraper in scrapers.keys(): + if scraper!='kinopoisk' or language=='ru': + self.Scraper.scraper(scraper, {'label': 'Мстители', 'search': [u'Мстители', u'The Avengers'], + 'year': 2012}, language) + + def getBoolSetting(self, setting): + return __settings__.getSetting(setting).lower() == "true" + + def setBoolSetting(self, setting, bool=True): + __settings__.setSetting(setting, "true" if bool else "false") + + def list(self): + searchersList = [] + dirList = os.listdir(ROOT + os.sep + 'resources' + os.sep + 'contenters') + for searcherFile in dirList: + if re.match('^(\w+)\.py$', searcherFile): + searchersList.append(searcherFile.replace('.py', '')) + return searchersList + + def dic(self): + dic = {} + for searcher in self.list(): + dic[searcher] = self.old(searcher) + return dic + + def get_activedic(self): + dic = {} + # for searcher in self.list(): + # if self.old(searcher): dic[searcher]=(searcher,) + for searcher in self.list(): + dic[searcher] = (searcher,) + return dic + + def old(self, searcher): + if not self.getBoolSetting('oldc_' + searcher): + self.setBoolSetting('oldc_' + searcher) + self.setBoolSetting(searcher) + return self.getBoolSetting(searcher) + + def get_active(self): + get_active = [] + for searcher in self.list(): + if self.old(searcher): get_active.append(searcher) + return get_active + + +class WatchedDB: + def __init__(self): + dirname = xbmc.translatePath('special://temp') + for subdir in ('xbmcup', __settings__.getAddonInfo('id').replace('plugin://', '').replace('/', '')): + dirname = os.path.join(dirname, subdir) + if not xbmcvfs.exists(dirname): + xbmcvfs.mkdir(dirname) + self.dbfilename = os.path.join(dirname, 'data.db3') + if not xbmcvfs.exists(self.dbfilename): + creat_db(self.dbfilename) + self.dialog = xbmcgui.Dialog() + + def _get(self, id): + self._connect() + Debug('[WatchedDB][_get]: Checking ' + id) + id = id.replace("'", "<&>").decode('utf-8', 'ignore') + self.where = " where id='%s'" % (id) + try: + self.cur.execute('select rating from watched' + self.where) + except: + self.cur.execute('create table watched(addtime integer, rating integer, id varchar(32) PRIMARY KEY)') + self.cur.execute('select rating from watched' + self.where) + res = self.cur.fetchone() + self._close() + return res[0] if res else None + + def _get_all(self): + self._connect() + self.cur.execute('select id, rating from watched order by addtime desc') + res = [[unicode(x[0]).replace("<&>", "'").encode('utf-8', 'ignore'), x[1]] for x in self.cur.fetchall()] + self._close() + return res + + def check(self, id, rating=0): + ok1, ok3 = None, None + db_rating = self._get(id) + title = titlesync(id) + TimeOut().go_offline() + if getSettingAsBool("silentoffline"): + if db_rating == None and rating >= 0: + showMessage(__language__(30520), __language__(30522) % (str(rating))) + ok1 = True + elif db_rating >= 0 and rating != db_rating and rating > 0: + showMessage(__language__(30520), __language__(30523) % (str(rating))) + ok3 = True + elif db_rating != None and rating == db_rating: + showMessage(__language__(30520), __language__(30524) % (str(rating))) + else: + if db_rating == None and rating >= 0: + if title: + title = title.encode('utf-8', 'ignore') + ok1 = self.dialog.yesno(__language__(30520), __language__(30525) % (str(rating)), title) + else: + ok1 = True + elif db_rating and rating != db_rating: + if title: + title = title.encode('utf-8', 'ignore') + ok3 = self.dialog.yesno(__language__(30520), __language__(30526) % (str(db_rating), str(rating)), + title) + else: + ok3 = True + elif db_rating == 0 and rating != db_rating: + ok3 = True + elif db_rating != None and rating == db_rating: + showMessage(__language__(30520), __language__(30527) % (str(rating))) + + Debug('[WatchedDB][check]: rating: %s DB: %s, ok1: %s, ok3: %s' % ( + str(rating), str(db_rating), str(ok1), str(ok3))) + + if ok1: + self._add(id, rating) + return True + if ok3: + self._delete(id) + self._add(id, rating) + return True + + def onaccess(self): + # Debug('[WatchedDB][onaccess]: Start') + TimeOut().go_online() + self._connect() + try: + self.cur.execute('select count(id) from watched') + except: + self.cur.execute('create table watched(addtime integer, rating integer, id varchar(32) PRIMARY KEY)') + self.cur.execute('select count(id) from watched') + x = self.cur.fetchone() + res = int(x[0]) + self._close() + i = 0 + + if res > 0: + # Debug('[WatchedDB][onaccess]: Found %s' % (str(res))) + silentofflinesend = getSettingAsBool('silentofflinesend') + if not silentofflinesend: + ok2 = self.dialog.yesno(__language__(30521), __language__(30528) % (str(res)), __language__(30529)) + else: + ok2 = True + if ok2: + for id, rating in self._get_all(): + from addon import SyncXBMC + + j = SyncXBMC(id, int(rating)).doaction() + if j: + i = i + int(j) + self._delete(id) + showMessage(__language__(30521), __language__(30530) % (i)) + __settings__.setSetting("duo_last_id", '') + else: + ok2 = self.dialog.yesno(__language__(30521), __language__(30531) % (str(res))) + if ok2: + for id, rating in self._get_all(): + self._delete(id) + return res + + def _add(self, id, rating=0): + __settings__.setSetting("duo_last_id", '') + self._connect() + id = id.replace("'", "<&>").decode('utf-8', 'ignore') + Debug('[WatchedDB][_add]: Adding %s with rate %d' % (id, rating)) + self.cur.execute('insert into watched(addtime, rating, id) values(?,?,?)', (int(time.time()), int(rating), id)) + self.db.commit() + self._close() + + def _delete(self, id): + self._connect() + id = id.replace("'", "<&>").decode('utf-8', 'ignore') + self.cur.execute("delete from watched where id=('" + id + "')") + self.db.commit() + self._close() + + def count(self): + return len(self._get_all()) + + def _connect(self): + self.db = sqlite.connect(self.dbfilename) + self.cur = self.db.cursor() + + def _close(self): + self.cur.close() + self.db.close() + + +def countSeasons(jdata): + seasons, epdict = [], {} + for id in jdata['episodes']: + seasonNumber = jdata['episodes'][id]['seasonNumber'] + if seasonNumber not in seasons: + seasons.append(seasonNumber) + if jdata['episodes'][id]['episodeNumber']: + if str(jdata['episodes'][id]['seasonNumber']) not in epdict: + epdict[str(jdata['episodes'][id]['seasonNumber'])] = str(jdata['episodes'][id]['id']) + else: + epdict[str(jdata['episodes'][id]['seasonNumber'])] = epdict[str( + jdata['episodes'][id]['seasonNumber'])] + ',' + str(jdata['episodes'][id]['id']) + seasons.sort() + return seasons, epdict + + +def fetchData(url, referer=None): + request = urllib2.Request(url) + if referer != None: + request.add_header('Referer', referer) + request.add_header('User-Agent', USERAGENT) + if __settings__.getSetting("auth"): + authString = '; ' + __settings__.getSetting("auth") + else: + authString = '' + request.add_header('Cookie', authString) + try: + connection = urllib2.urlopen(request) + result = connection.read() + connection.close() + return (result) + except (urllib2.HTTPError, urllib2.URLError) as e: + print " fetchData(" + url + ") exception: " + str(e) + return + +def file_decode(filename): + if not __settings__.getSetting('delete_russian')=='true': + if sys.getfilesystemencoding()=='mbcs': + try: + filename=filename.decode('utf-8')#,'ignore') + except: + pass + return filename + +def file_encode(filename): + if not __settings__.getSetting('delete_russian')=='true': + if sys.getfilesystemencoding()=='mbcs' and isAsciiString(filename): + filename=filename.decode('cp1251').encode('utf-8') + return filename + +def isAsciiString(mediaName): + for index, char in enumerate(mediaName): + if ord(char) >= 128: + return False + return True + +def getParameters(parameterString): + commands = {} + splitCommands = parameterString[parameterString.find('?') + 1:].split('&') + for command in splitCommands: + if (len(command) > 0): + splitCommand = command.split('=') + if (len(splitCommand) > 1): + name = splitCommand[0] + value = splitCommand[1] + commands[name] = value + return commands + +def isSubtitle(filename, filename2): + filename_if = filename[:len(filename) - len(filename.split('.')[-1]) - 1] + filename_if = filename_if.split('/')[-1].split('\\')[-1] + filename_if2 = filename2.split('/')[-1].split('\\')[-1][:len(filename_if)] + #Debug('Compare ' + filename_if.lower() + ' and ' + filename_if2.lower() + ' and ' + filename2.lower().split('.')[-1]) + ext = ['ass', 'mpsub', 'rum', 'sbt', 'sbv', 'srt', 'ssa', 'sub', 'sup', 'w32'] + if filename2.lower().split('.')[-1] in ext and \ + filename_if.lower() == filename_if2.lower(): + return True + return False + +def delete_russian(ok=False): + if not ok: + ok = xbmcgui.Dialog().yesno('< %s >' % Localization.localize('International Check - First Run'), + 'Delete Russian stuff?', + Localization.localize('Delete Russian stuff?')) + if ok: + fileList={ + 'contenters':['CXZ.py','FastTorrent.py','KinoPoisk.py','RiperAM.py'], + 'searchers':['NNMClubRu.py','OpenSharing.py','RiperAM.py','RuTorOrg.py','RuTrackerOrg.py','TFileME.py'] + } + + for path in fileList.keys(): + for filename in fileList[path]: + filepath=os.path.join(ROOT,'resources', path,filename) + if xbmcvfs.exists(filepath): + newfilepath=os.path.join(ROOT,'resources', path,'unused',filename) + xbmcvfs.copy(filepath, newfilepath) + xbmcvfs.delete(filepath) + return True + else: + return False \ No newline at end of file diff --git a/functions.pyc b/functions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b50773f8cfa769cff2f60a406c3b67a6c73b7c56 GIT binary patch literal 54700 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¨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 literal 0 HcmV?d00001 diff --git a/functions.pyo b/functions.pyo new file mode 100644 index 0000000000000000000000000000000000000000..e03d380e64bf6b2d417fb220b41927ce3c393a4a GIT binary patch literal 63609 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 literal 0 HcmV?d00001 diff --git a/icons/history2.png b/icons/history2.png new file mode 100644 index 0000000000000000000000000000000000000000..6a1ddc234947dcbf5ac881c46624299c57bb2a2e GIT binary patch literal 49057 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 VrNDS>sp0?t002ovPDHLkV1iw-Qy>5U literal 0 HcmV?d00001 diff --git a/icons/list.png b/icons/list.png new file mode 100644 index 0000000000000000000000000000000000000000..ae64f38dffc7b3ff58b59ca586544a4f89b1d5b6 GIT binary patch literal 243984 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

    *#FgWp^XcP)7=Bm;?|R<{@(Y#*I#z; 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

    kCa|LwP5@$BZBab9WKz_8o# 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
    waG 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

    R}#myNOj`*rKk{uav`K& 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 Vr-XAv3SIyJ002ovPDHLkV1gmB@@D`5 literal 0 HcmV?d00001 diff --git a/icons/magnet.png b/icons/magnet.png new file mode 100644 index 0000000000000000000000000000000000000000..b63cb9121979ef09589ee5c3a2dc9f2965f6ee8a GIT binary patch literal 43437 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 literal 0 HcmV?d00001 diff --git a/icons/media.png b/icons/media.png new file mode 100644 index 0000000000000000000000000000000000000000..e5021d57431c76c139d595f3ae64b2d914810a37 GIT binary patch literal 43787 zcmY&PAgHvIf`ovebPcT^q?@6; zLptZZeAoK@@h(Sd;dq~W&pl_Kz4v*e^H`Ofgoy-#AaZpzWjzRjfiGbY5drvQ`YQj$ z^>^-is)|ra56c?(hQRufsxpMV{*%@4?F0A;v8$S~I|Px^UjKzbsp)X=LqZRAEfvC1 zG74%2#?-&3bP&W2sVgh!`%G*$*vCA#_Z2wtpD|uYAG^=>%7X7_d2JCxVQo>Wa~4Ka zY6@)%FPSyD`7S14&!_L@_6?dbdh3psRVHF%vGSC=Honi9d*dA6&&3LMnEH{?_mOH1 zp6mG;2z)ZGdALY(F0tab(rG-OZuF|??{6n>|Kj}bC6k+yx}+$&M{Y2I+gPKG|Me~o2j_3>wF4z2K&NFx<53Lus&&Oq^ z2CwQDSg{}Qj0&j|duovR4i9d3wNQn0Mty}-TPsHi-?om4KlXOcPh}bvy;ovyVmkV( zI;YT0MORZLo?Lx7LPI0LJ)=)_csBiRjPM(G^TqT4eECrrSoY?ED^!cs8U9+rocbcU zHskS8o8F&~H?`Xyw8j*aC1EG*;&4^s%9hx2YZ=bdQIJLQ~R(fsZ` zw(9eIE2i<>$IU5U@AuH5?kFOn7ZA}%%=OC_V^U!<7~P&@DDcUktNcMnibHB%s>ZD$ z<@*Kg){<2Y^emW&630H#ZhgA()kXXbNz}HlQs(ruxtN5+9UdCD5AJtV+7guc@vYT` z66stM(tm!_~N=l_sPY+i4Jbsd!5WR>ga4X=&2RQnChJT@UJLs*>mX|8*A!}Yx)C1 z3wuWVFV=;XMm@})+6bHZt|C7a=J2NScfHegqajaI8;P;zteip@adA$62irmcdgIgMo>6mf^9HASeawD&|WM%U&t|) zbBN002ak6jBqCcY?+rP4E-)y{k9u$?5I=wI7vKHjefNv_$KSxw!0n8>i>>T!89^)= zbuGQ`T8e-6taW{YNlZ*kmoE_w4_!c5#ss@hdqPw0{=Hw~8sE9!e8M<5AG1eC{RrnH zU5h%6gu0N%t2f`Ct7|zHPTQoGnYTtAI;1A*(MkM~(1xDZKIErUfju{Vs5zRwA!%Jp zVeq8+)}P{BBy)uc`6mthTs_9zSHw%N7?<=IKRFCv`Yq}z)Xd8|47-v92}MSMB@`Cw z(A^k!BH(ImMYvhBEG*c-Z{AdtzS(Ia5DAWAGC8B;?*SRT%RP=vi%2BK(tO`6fji%M zic&qX8LsqAYTt}-cUhJMQc4gNxv8B}>kO|gNz1c`k89qZPFoZH8^$Q|H~HqEwTb4S z!Blabfq{XjilK*!u7`Spr}46+jV1$keJ$qAcp`Ev7Kx|?AN#_$R%5B6*$FF=&E*cf zbd~aSjayTQp2^*U#5kJcQ2ATgd$On9IyDcSq7zNQgu zf0YN(+{iJ6mWV8IT-{nzu&`h&4={dypYf}nI=l>ySmFH?UG2I@!?$$*->K*K?pF+`PE!(E z3K0y7`e|y3kgGf)AB;*#nVwd5ana`dq>=LGd5c2hGGxaD+tpoFe5tO?nV; zYaS$pg&`ubEru|Lf4+2YRlb*&+IS+#i|!T~nVGdNFTc z2v3l{HrM^v9$Cz5OYix&R65GU7&CV8E+F`o+Wd%z?*7s1h+@Qb8-z!-AAHZ@ZAjn$ zn0Dk|V$Y{Jh_ZqU#lS_iaBavywlXcqGUCrRedV~VSA$bz`f$9ox$B1he}_cod`Y^+ zhM^yQn^Y6NvcFwz+xr~B&2iFD_!L7K=TmVx29Jn{po&ZTz4R(MC8hlx^WgO-P!+_) z#2bb(#BJG>@n~>De!n{?A zOp87K`s4*?eBUG6XF-eck!07W@r29(oQ5HpdV;1ZQEMf#wfuXS!B5&sWIM9+jYKS_ zoG(cOWO^g>y?>KB{0z!J_(_MeZW!*HybSz!WMcV%^2RY|o$WKNtY<~5o1=>umEBg! zmPcKzst~){B$D;$>)`JfKUX)pa;mBr3iN4S^Aq&IquV(JOsi3^azp$BSsjatjEs%j zK@KP`zNcR_jNX-4QMjjV-bSg|gbkMd9=y&7lb=3@&0H*tkAIUryt6Ke67RKgk-=I$ z>G#nX*fdwq;ph5KNU?Mwi(!`0;OUu-aKnsfx2)C^k%YFv7>*u^4>wdE^3#XfGYM(Y zmL*fDd+8oHR7B{Ng(+sEiWOnuim>+bb8NU`e*oQE0rlMZ5dCvvMbr5{?yWJ4mvS19 z67YH?M731^+rVgRrV}~%sVC_0(g}epGFm!=ez#`N&p)Y{t4Ewu>9UIaBc<$|8b`nb zp=#9ZbO^$B!j1SlU806KKA#BA1QRP2Ya~7iHf9ue z)GWhX*&t?8v0gb)I9zz1udh>Js9UVBTQICsWN2kv>233+Ao0aE)`_;J-wn_2+eAiG z{m?VKJGJ&5{evGAU8-F&HIxi)KxAppp8Z~O=cS7_>MgZFBFXO-IU}1YD)2F0XbD^! zmV~w{h3z{+KAbz$)wnpPMg%G%LY%IHqIDFr?_LM4CG`jy_q@auphAhm5|Ng?0aS^0G}KRJPSbUYLmMGy^&mQ~WP zV|xEu`}*RiVTO+UTvdpc&g7pwmJbfy&8)S8(?CTVQ0$KS*CzpYKw~BH(XSuy6#3yiq|@BCH|ND@sKRP1zQ!&a4YK0=gsan(btyFY7 zt;@!uZVnRCsjT(uYu(qv1&Qy^bDBJRc>@C~(=&$xqZUJ|=8Z$&Y#rtPw~Ou8#EG`e zZt1RuO$)jPhgwgOZaomi@Ap$Fke2HGPi?EeU6qi%Wfe=qN25o^n4MZO`zMSK^#ZFj z3$V-!HwpSYAywaPc$(gP%BE|#TSp4_yLOKT!6w}`MrJl`ataFW1vim`0tXG-*<4{-{Y~qnJRf|HgL$+RVmWkUJuUr%I;Z^64r2yS!5x-G; zNTr;kqt%#s^Mv{S2(8M^*rc3Jt-%e9onrb0oxTc;`bSw!aK)sF4yLrE*s8(+*(>o? z=HdAk3yOJ4rZG5^{70?Su^hv{8=6G@V6iM~xfR3R#5g?@iqdV>2Zja)+fixDmi+Wj zG~>7vG;hDxyiN6X&6R~P*P57_8Km8Rze`u*d+Xv356S6B+S&ixJnA?bHB4fAj%4$C z9c_V$BeU`MC;Rf{3!I5bc~bO8ZEeKb8e^4VJi` zx2sSJd!PSj*qvKV|MnK$BWK5ABmP?M6pb5+wki%=9n2CmQ`Ae}e#%UFU?uOPpg+g2 zj|B`2L-ICO*VMlV4pkkq3gaqSIg*yHyy8vj`n|GmWNg;@-+z3s%n4kjDlSW`nh2a# zzVc`F)hTlj&NZ4pR5l}Y73HDlQP_cXV)N|JUe@w-KYSP=B;kew!YKrA*`;UU?2s9x zZI!?P*0i)VP#~m^dR^|OewYz^?Jf}v))1qgX#27@_WAwr{&;Fl%@~_k^LPY==gktG z%ggl3%g*x?6&us_4NozVCBGGhj?Ve7xH69v(6{YYn1UGaHV=Gv>SkO>tZ5SsQa*C~ zdieOfpYl9=459!2CFAdUm}{aSkhH(vfuoU2^Pg>%ArGg}_N%5TSz*Wcl4*0Jz0VM9 z6fNTR;}$=r@3Oe7^UqrvGG6mXJm(B|0-&JLNe6Q`8i%vxtV7c9=~G=^y7v|qofGR! zhEJ!?0v#PmD;MxSct=uiVd$=O6WLT|MB-RcYUWRSz2KAMu_d^xi_~r9mYa0chweS& ztG|hQ(rXwP1Weny1e>DUb8peTZCBeOV()vk@v*Egqj=UmII&#Gw#Ea;O<2lJF1Ax4fQ%wz7ZAk8iDz1aQ9LxnRMf9( zq(??xDLn5NMLt72h#$^0enyvwc-5Lcb$^ax!^IUQ5cu=^d3my=MEIchbg+{JfxEkV zwbvGt^JH?zd~ti;#Pp5LzPLCpM~$;PiX={6w9RVwtB`3@u?^=Ar5g|hJMIrwV}q=A zYhelMxKKQ+02|zPJ!(Y+_1OzTjrlD(^+>-BuM1BV2N=#iNT3FmU0J8$PmddlWdBUwx z3h#*?%G9V*ta&i``iN<$zJNQ4XC9XGcDjMq5#~4Ca`4XnZ%NCRg*zjbw}avO&#LF;V&+?smSFP?hr9_yG+h(bw6R1-*#Wnt$`NvfOlMc1dlC0IA zQEr3HSC|y1!8}B%Z#ToK?VyFfx$n=?%+@(6h8RV1#ACB}W@>bmS-uHab!;p&?cN#b zl=bnMWmD-0;9`U+YU)xBT9Q#0L!2-UJT4l&V#5uv7C{`SS%NFb_Cu+NYQEpb<@A+P z)w0{B##HEESEKyp;-W*6&Z)jf%I|IQxnpYAs8T<=&%haVlh2sx35W$DNWot@1oDWG^Ex=GI@bgGN4m z+!K@dSevd&q+`3a!nP#pu@pq`%!dL6%b>ONiy4ukjySd)cVVY`@6Xdm6m~lQITp9G zY~!Oj4fQzxQ=Rbh-Js{yJp5?^PByZ`#E%YN&a@EY)j`G{w`!kZTiu*;4U5_(ZPUyM zspPe($QIvIDIzi|>)V>84QB(%Uj+rHPeWVVFRPD*F8l6l!sdQOotO{BF%gpP3S+UC z*md2bcTe$$YywYuM~=gG@f27h={VG?klBE`ie!Zdf6m!Lcu!FYZk1hDSq%u7B!91) zDC#Nip{I*AwX$Dl*;E6;uXngG#SOHv`va8&0tl8ii(URMhqJ5q|7an>s{ZB7%6l=-jY@ejJ0&0h8o`PcDcrC4azvEtfSdQTFE_;iVAgH7$$ zf5+N5D(X~`_Vpj@32`X1;vKL;W78T?C4-Xn`Jco0|MTb@>gHfL7(tx!vDwVM*n0oob`;O#QP^6?o)TnBZXjJt2A3s8t?NEWK zDo>ow2lrgR{IbF18+J|m%R0K!oUgu8&fovOEkCWpou#wRmTLJmA_Z-@lc_CDtDHdf z_0{w}n55q`cbb?F3%8-Fr#PDh9z4n;%B=FvZmY{|A0f^*%<*7ofS=5S@RY3ic#ztT z6!-b?!)@+pvJ<#QwYI!0_3wB{b?c+3&nQfp6}1K8uUa`vW*<7*8~%mK57L~#;gDo* z4QxZ$V|dp`nVNIu3hAdW#o;w`Br*6Kkl={ z5xTN01TL`lS01Wb<<2gfMsg-cL&OQ;?4Qa&Jg&}_;QqMt8~Sbb?+>HN2t>%36ld@1 zSUMBg@b2MeSCny@^108@Te|z(TL~YsSYFN%@qXkC6NWf>0XXcNJN`&a<0=fzSwmMH zDO=mVUOFAU6hoSn{Ho)=DV;Z8f0439WE(o_i(!4-VFdQYS}GU9zmQPvtgaVHEnZ`!d$!=*obU{dNaO?)Wb$}7db8l zH^hmk{DlT*q9w9Z@28yixTPTzz4h1oXzq*5fI_ySrYKI|ZKQW7gO!Lu-H&YhX z#1`dP@6x}-kZOHP2N45rWw9CgQ)KEnB{g@xy{ctvhhZ^dy- z2v?;rm$Ymh_nN+r(Q|foA{I+MfWstl-?PJyeV|wfHX9RJS#{y)j)S?pi)7C1hhDLc z@#0p9RM^~&8M5APax33fwH5BQ$uEQ(8Xh?XqUt z9hH|C890_3bhGT{X_RN-Rk&fWi{TZC$ zPo$=(3PoTNHt(D3q)`;15LMf6iYgec0@VaLRYg}_25Tg*l zo8%sA#1Hu0dSlYeyKGt#llQtiv#wnB?ebUSNVr91mbO^$QqL02xv0Ik7WbyRAxYoo zw@FbLYL%=$#BMVRHKa>6tJ9`&MBGJ7O{Wr3(rF17R!hKh7^56pb-~$-S4-O>8sN#H zcgJp>V~5aGSzZjWEtrHUR??6t;SLE*z+#Pz-Qrm;cfEA4cabD_pSCqWjqLvpikOH&zG#ARC=BBNP&l-neF? zKxP5Fc@FQcNQq&GKEq%x*CQyEMM3G$KqXeYKb!+&_Fa-l?JwzHkRWx*urz+;fE|(1(nQ;~!cobap=|0~uNsJL$XlQ71W)(-*{lZ~BhYBWc^$`B9 zK2O#NtD%j6-s*{UDh~u>)@{6|?nyb_w5uSZ2T^KaPq@iRg0kPW!4Um``is5Q$W z#7o>`79X;0bhrQcDPhGGe0*Z#ilEcY67v8N8)~H4S@7gZa%!p~kS7{1w_H>;a4?lH z2HT{Jgw6h9HAOxl-V=*PljkkZ$e7$zq-59m229esfi8HB7pks6D3z9a_!;h zDt}w-N}-}FuMDI+(5Uj#znxA00!ZOC56N0MYL%$O#9eI0X=O-KNAw6wZHVjej+vMZ zm%SO9|NP3+jBxgIjj?)+mh0Q!y-?-b5LWW$P8`CQ^+#6*`ksG_7|K*kQAlHBL3qhL2B7>X97_MUh+ z*AS6|e7eC>e~0a3{L9pcxjBw{5Y?T8GuXh%^F%*(^#r?b^M=hD%1sH#cgFEQs*HmTF-Q+N>Q0mz+-!OFhobqw)2tJXhHeI32>UO# zvUQxC7@5`IANoSc9FW|`6=f+!5w_ry0#g!8Ywwi1ax<-Y)sB0T_@gqhbz*`EgsBrS zA#AAS>IsqIDiR4TKPn49!e!AtYBIw%>Ec(v*&kIV%T09Q#%Isk6@f!or zDVjNERtUa=-un35V|T{&ePDQ$4&M#kJ4soNBx2$tWwo^-85yDn$rM_{A=3c}1N>PD z++#-L%6BHk1Vx6Sw#KeuxKtn%=~SAp_vri_7wsDGKTZz@Hv(czO_-Af{o(q_YLB@m zw*TXL6%1l(>}-k^AR_Ycg;YIg-h@@u8oHut)wpm&xz(EkQ8H;arKDZvHV$^guSn;z z^!cnD-N7>*9NGfe_*(WE9yW-Hi(AO>+iu?76*@aVi`TprO2eLxkBCJfpMh)o!-<(Y zL?vn4lN;7mj)t>$-GBZ1^?Qw6A!+Ftjoc6*760v?3PVZ>Y2v2RzvT@cq&9$xSFWBJ z9O&lG{CKIx%w!~R{dc$8XO9yIaYE9fF@QAFeEitj z-=C$Nzpj6}Fx#ZqH>ip;H`w)tvwX8hZqch-Q8+(#M&@bglM;3LfcJxLi{gjmo4lVw z>=h8KKko~JC*BYqsi-9pQeNpe^^~36NE{atvY#s$pq}nGYt@Nwi+{|Dp7wxMy5V>T zRV`0{y!@g+Wl|jNP(g<38ypM;CIxWUI8!unAW$<{I$<_swI!|P{D6zHc5|a16dCln zJRGHt>l8*HqW=6*heuGyXo+-KV!XckCm=$^WQ&>K6RpJ zvZUP2CQj2^>;!#ubFIb-Pa?GMeO3)Hge;ZsrG#w@y(h%+qB;Vwd70=A(T_K3H(FqD zX}t8AoAd!FaiJ|3-eP*IkTuXJA6A$I7Z$=ac`cEB#8J^fIO(|MfODn=c|1aWk%&!H|U9LPaPqBH7ol2B4VL$D9EuTLp0vx2zJW$akR5{~`I$T@r{orHn zrQzoxB;h!TNlBraAbNwNcGrta=ZBwKw7;R{aXs2JPM7kgIGzb&dz_IT!tM5St;5ZA ze_89=y)ZBUBz|d!iivHO=kH&851bUpu0M*(Ih6{=FD8wO8g%{iDZhY04fKA5ExFkq zA}B6*2-OOavNN>5AS>rqnrCTotFH@TRd1L%>B|4(EBtlPK3z6|XZn2lcy`Xa9=D;P zLC4@mjPS)-DOOUztTrskB9L*k)IwD@Qxyo1dV$7?3d#z-O(w-a3S$K6-pJInZDhod z))QbjAS3`JU|kl~l_UsC{skuJ-0gRH4ECQzJM9Kzi^nQ_a>vf4cirNLcudOW;1X`EF@_NOyN}!zVRa znGtbV1lJ_lfZ93o)~O0c2_`j6H$6&dSwITA-d$-5G(QdAT(uO=Ep-xy@rKQQsr1)! zugk~zd(wSLWsl0@=92=~sClDlI0T3}(Qo->@0aqDJkF4Q11{P3;$kbHfr1)!UC0B0 z|r^7ZwMie4f@cb*`HeuFow9%ZtwP$6w z@n+cWA&+-|!Z3C_#=uL`TywtD*>F7l_ED1HLOX*w8t5P~6%_^$KYXB!pEMEqMW4^6 zNJqXvpF&yg`171H6ZFoMbp7j^>aUCZTi==_lwM|>yBOuHOTFDCCB57fx-oXR@VNj7 zw6^2IQkFl$>Ta7_|80kSqKJO2yboZ$(}+EH!YCH#vRYwrjFjy{|5OpZ_$5 zN5BjWnk6Vr{Hz)qXa12gHwr2%a9hUL(Qjqc?R1!Z(_Yx?l#5wf!k?_KLGfhz(~y#q z=Ih^E92wE!rDw;R@@m&`bsJvo)BZ@bGww9&*7ik2p;f;U6L;3hWj?D)N|eZgr{`g=-os);6@L0w5XT*zo&6XL zX^#XwJ-v{)c%)rs0R59EPZW@uz{2(CIjC^}0oWQVU`h>(TFOl;%;nY*ig++;CLqbA~aD+ zUh7|W7)n-acVxgj1*MvZLsYHI&cPziq+yCfX;^{e+Vy2lsIU^DQOq*E^F>cUfe4rn zgK2rT(W|Sx04ZhhlCX3Vzdnf(25y<_jO}x}l!U9*_~s2UxW=4m-64-?K$3LA9C0=# zF%pG93d=Oy2EqJygJXlheeF)$KRNBqY=5FH^UhQtGSxO1uVRM6U+O)Ex-d|snraA9 zf@yj33$P-IP%ga@%;-0@Pde^gd~iMt+LAh%CwftaIdp8CFV{|Kb*vg+z6y9{3f0Q2+g=Zh(2qt18g zD9eoa`<8Iwa627tiXKE1H3*PruMF@VUmgf4ikq-9YfdCi?Zp8_5($ zMakk~W;au+Kz+eW5->*(7d@qZ+m2IM!nW0V=>KHsUqjOWiUl5 zr~leaR3gEu&Vx!dU+;0pa!3c8)M<_6Y!hqadc8UVrnl4?Nri2G)I#B)=tl@iK1q7% zbk1jyz@46+-Udpa`9)pOu{s$A1)goh2Hk66Y3Z;JJlgY!!f9-v^u?|eFllmSRv|GB z9HwSIY6)~ic9Q|eQ@}LavDB3$vlk;_TIY4|Tf*i$33}fA@IX!#E*cGtYH!B{1EkHo`=4|m51*;;GdSA;}FLNl=!D?Uf#cGs8x>M9VdEx(Wi z${*pU1D1)mw-B*o2ES(LndBfUS75=J5d8Wo3oh@m-PG7rxs;ybP4`3x>8 zM#)p6JRehJfw-K$NucmO7FOLV|4Ii(2l3gaxLiFL*eOjaNIFYk+`IE{1#?V_=NXz# z@V6U|%|TnkMXil;qj&1rV^yqPE~fSN@5mtUOoP8=6b7IjJPDjq=70)xokDVQac>y} z=i3=9lm(KMDom6L^c5>i4xc{W>b#ZXcFzaCJ8J8GWFIIh zj5gwr0I2bMsf%TR4ehW4GAZiHnWH=+CW%6aEjQce#dr4s61uWsB&sP9Qu~E%GIJhG zAX>b1rnZEJ08FgJvka+W&*EaCZiaaO<<+<(8x&=m6v-pRGzZ(>&@KQQmr78OoW21$ zf%8RNqOBFMUWhwSqM!Wv2H;+>h+PkRS~p09;FV(t{$(-2+3UcFSvGauEZ-c~t9_$t zPg3l^FG0Vcg#kPfF4kV=2Np% z_~{gCyX1h&yEcbvjT&Ek4;(+~B5E|=-nb~~chZc&SC{{>>%A>;gN)2I&g$#aL66ZY z{(8Q7y7rk{9e8Mb)^d|}7uc}yN+j2ZKeLZ9Y^eP4Yots@|-M~$qVmcZu6bO zV@5_eiJJVj-y}HO#Y^Il{8*T)x))oF(vt`2GJXV?mjM8gUh_)870vfaQ7kQdy=)yv z>w@aX$|L7f=2rog(}x?QW%cze7gubTtEzBD#%43`sc_YszIdP&R?ya_L?oe;yBG!O zNlx1L1!oI*GFvtn1gw!rBzAUM;Ill{pEs$#{|Lhd+?Gk+uctCi5Yr8;N?B6&IaJr# zZj|b-isziqXyAo;!6EB@!MzET)lKmc~YI<93eNTf@ilIf-XRzxu`i8mXyR% zPt@h7b3OfM3%XQ-0b>C6-`g_QmJrta%T3?{VAwK0&*?l>d*l6UCIk1x#Ka%vH(=Mm~G?DXiRHs71DE1U7BQ&G4* z{#NsLXmGH?!Qr8b0+iEAO+bE#^){ECS8;IIlFxY(d`}+z`&j3zgKJ&U;U)1D%`C4l z)WOn`eCzK0`zd7GH7f#>zGoB%$A|dtN2UpANE7_u!=G;O-@9i8D66NX=IxH94G{p< zfI_0?fT?^3Zpd{rlz>JKWAd9lozg38{?|UHQn%MsaA?Z&!iXw<04DrI>v?6>kyUSxN zlD{qqt$V>@5obRw&MRg_wKLK;gJy%zMR>m57Dfo6jQHv6Iby3$26l+Q4cY^S5e#80 zfWY)Q=vUpFa4el0$bD4pe|jJ6ayVEqKRB>1~{tt zKJjUa#J;Kt+3{a#+J5Hw%^e}%<+yIeNx`k&0)YNC2a%jdY+!(M%Q|QYL7lBvz@E{E z3uFk^!&WrJtG6z?0joL)4NDxDMNZv%P)EjwcM#L`2ygwscP^Yk6gm!^BhAEqwSw<# zZ*8sZdmj1!xs8qRa`Zob=UyN5#Nb9bKUch(rH2O{Xtd?b15a(GFAoM4(p*4S3+!gW zxWZ((0RaKOpWj#Grm>8vF@csy{#zo6Zl|GVNIHfUutv~Y9-ak7&avEC)v1=kEi!m| zcQ;mQ8@)E@O|a3)iAs@U5M(iJczxqI(@%&-nzDIZ^^X>)@@b3BX*2Kg-|PG$d%1>Y zs#nhm6vT9(Xw=R*PgxEP|BRrQo(OiR=2%9Zjv8+R#y#Ni_B>t?5m7cekM> zA7TYm4L0mar||vz^IFn5jK(%(Ud0hf=7Ef$gb`i6E3;%jdB4}R+#Eon;_C2ucl3+T z*IPzOr_R$PLqs?ao2HjwCq8ObEd}+y__?#SvC(yM$A_PuRPPkb zK|D$lm^(Y%0D%tj3Y?j_b#3sQ8=#>+b}gZ+0~Wl8O;bm$-AnP|C2w4&>)$kC&vzCw zgHE`B3sFga!MRCLTud^0(ED@8(2#mMob6cop$Hf+gR%byZ{5Lu!-gf9zqWt2(6rwp zwHGev4-2{+4cfZbkS`~0v0M+x+t;s|dgYEy-}*;V_)G9UXkXttKOOo?J?3n$_Et-g zyp)}jl`(;Y;mSeC1A`)D-SbpWn1;>HBMw8-pT zaa-shzgUpF;sV1-*H||$@ZbxOrbsI1m?8kY9aDUlIFnzGGvE2$fxX6|VA+JScetSL|lEw~> zXobnkJBY2X#z2*$F=UM&9$3a@+|J^uoVW+0SUzw}J$h`MD3@QjPFOy^d2(`6O}D%% zc<&y*XCQ(P4A}s{%r78d4FnfvW@bRjBnet{&}vHuOYPLt9#46*J2~(=*?k;}Np1*5xs_|^WE=Iw?!2fI}h{?sb>lqHm2hbHQ?)y3+ zk=dpKgp!dUtpWz=-wS~yiTb5gS7B5~FuGFq*PHi48pm>c9OlPN-Qx;hAIW-B$u4OBqy z-_bz;Qqzz6`k2E*&yO0piE0<%E!;ru|EhNf;1_yIxeFmsW^Zb0YG#!-u~pj6EqD7~ zoOH@{fItwe_S_gj@_euQaK`+Qtlhf*v(a}$UA`M!={R!ML09{kol-NWJp?&4_)G7& z)vr6~q^1j7(D^x?J3UTE1cSOP2)d-}#t>kjhAk!Mh+JM0vR0xybfc^v%A182yk>!z;GmyJJNAJ&I-mGx(D-eIUqw3ThgGpAX(S>wm170X9G!RC8jlc z0RZ#8di3bg^5kSX5Cuwi6|*6;QQe|poYp2l5YjU+0GSU{e$djv*>zuYP#FMQmd<9d z7*f+(58{=c&#kLth`_zgpC|osSGI8vu8<2XeTQ&>B7n8p?cbvMr01xa8u$FkRY`SyIGbaQfQo>n9Vy-9W>V0X!(bBt* zCgtiC=!Ds6IsR?w-Jse@8bMohEz8s4IX#$|nZ(BZBjHR7oA9AyTRkWZ9+k*0!5us8 z7InfjV%*Zb4f#G%Iy*U~KQl7=-P6d6X>w1Aad z-PviK0$}tyBNY_fx&Hl8&x`GyD}fU8hJo^iRb0;xA3mIH+R2d)iYoc2v6kAzG*=@1 zvF9_LRgH(mM1gZQHygziuIG7DgZuABcO9i=WW;_nwsKZ^#Pts43egPEZ1N?!&620Fa0SI^5Ei8q@6nK=XQAG`t?Z)=okz zMnDmWS95LpL|834eckUB)9XB*IUA{(4<@{c2G{h-;;R}*Vxw^w=t|wJ=xt>C-_`{}rj3 zW{ayOi^?`u|H)P%GXG_f%xkE=q+&g{MqrYmd@2bDEw{NA{EK#r3w)Ar#lCSM07O{f zQECn1gdU&L23CC){%iq$~q4-EE>qY*pmY7fc5&44U=o_z}vg;t8A(xMyzny0h&Km`xWGNOI=ay zL%W^qKBH;PYkV*ThX+JE3DZV@MzCE#kb&_4vIXcg{<1rs6sFORxq31~Z=~fk&MnOV zr00>{Q@>co{$q~nTma3Ka#U2L8cpX$X;W-z;9(KS><*+u!X3M1aRFr4T}m^Y6x|Cr z8^AT-e~8`R-v`=-a<&dpNqEVILfG+V_2l!ue8=kJrHt&QtjJ(UED=Ud)>PRZgz%}_ z!d4{^JI9BIu|!e5OR#kI?Sg+1|AIRUc|i7%Hx2>|0C0n+v-36?s?4M~5!6!YwC>ky zE^;1bgexq7C{!z!YWJr{NpFqho-82J+PGUME{8AewMK2Q-oD z2qc*)b81%qpBKQcyatR|(!ejbHWo+XxYemzf{`_(3SCQjmScg%vOrD5p0HtY2iAV2 zX-ILxIo*!oLcpxB5O=j2=ejnKTj>L%wtDr7#>EeV+5M1tfd^>5W}tYuUY>a_?w>-W zI&}E8C1B3m%ELpnPn2kMCvpxl{wgV(Y(G14i6vNwUH$xk=JaS9tI8$ahmfb6$2r^7 z-Pzx42`6PK(Y#FSgaPiM5O8>L>$O*gD!M%zwSgA*Q_?rr)^x9tzZ&;@HEzK8hN-gM z`=k-9>}9h^{H<<|X|U9IWo3mUjCQCIpsed=y~5;r`tW~R2p}#(a$foz4v&IaxU98_ z4B<1c2mZG|G|$emJDWB|jE@^98E#fAwd4y?b9~a6^A23`cI{;K1`OR$zXRoueby=O z#{H>EnKSm>BZA~>A;a3@}yf>P+X}=x-2UOW#;?h0Y9}sI^E8Ez=Y{N_J z2z65mO?}gqT*ZkNf4xzdiHkfZ>XSyUcoHr<=Zn>yyq3=~*3 zDZsZj6Qn=1nJMvd@F0n>@<|D~F;pBQtY2gRMtlAnE*d>F>23yW(q7BHpwF1R8nHW@ z_zS*IZI{P0ar-O13xIC)>3X)^Ug0>p>)3SUI5s)?GOfhDXYX#)zq=>9k#a1*cyMbA zTwPc?;O2f?4=%F1-R50bsbOcI)6}1);?u&X%3_zT*u#qlFMO z<_M=dLDp&tJJS0TM)*>5hPjE4lYbzeeG*5_34$|=vAgZ;EjL5l>XNi^ok1H(L8nQb z9%h}z&#G{ak_GeEj(47^WKB(bT&>uY!LJhq4YxwBMsd0S#)$QH#i(HNXvq{}YG#yB zYp`KPVN7fFSR@AYo@A8dR_jA_+tmvcfPlVE$Jqc$M_8fUW1m$y&$(xwvw-3^Fk%@_ z<+IyNxVNSqB*|;v@>T_}CZe{nF;?y*R1Uql>GZ^Yj_Uw4^sUmhC8Iaubdxw-JOjKP ze-ozQ|DdlpZoYxT@#S6e8pXQmy|2w_9E}m5t+e*BWRaNRC3U-7D|&|5pimHH9b=JBAP{qWr;9gmZ7dnc5!< zS^{6#Z_wC9DFF1E4C7C<;_8Zb$Xz=M_8gCA*S9NUbiG$F4ydtJyUW!P8h zSlAra$f|D9S~@GJ^0@IpEDD7ZOtzlCbLUQFvNZykUu*vQ-I?HXdH@--g@Nhm#?{`B zpVO=LSwY{$7{dFjka ztkNf%Q>RhJ5tXE{0^u^|4N4Yvyc?c)H}{`hXtHBoMseRWMufYD>jCS>#%kZC*^q*rviC${@z~vffJQyZ`AN*jP zqqrvMUT+Z18cp2XHN;eKr}5CBZEh2*!}U2y2b=K`A0R=;aO3GCVD+5?KR#KnKa;PM z@x|=qrx{=u>1@HT5X@iRc=yeppOW1I2GgEYndU}Ax61D- zK^r2}jdYuT{_uI!-OuEkt8I6YjCd^L`PkZ8>UQjBs%sB_Vzma_5cDOr&6KEd-tTC9 z+Tq~(QxJWOV=XfUVwy5I!MmwQ~28C;i{U!ELs zU=_7xQ~uRzla@uZxV6scB+S`;V<*vfB~*H<&_oQ^qpUXt*K@zv@TH`rQicEgAaHA8swIimM%1&HsV&JXnx(7PD){BW^39X z5r7tWlRsdqV?3`!k;L!!InHKP`F{f>7xG_PI@7z!L0@e6f7@#gcP=ve z?Y=i_|Ni~f_&pPnK;Rhs)*faA=Q+HP9+!-As1Ayb);fl=-TRw?7;uR+z|@#{Zty@|?O<3M5{YV82h%Da=)S9U3H=<6QuR>^w4Byu;iJ?$9`Nyst z6GM;Espa=9i50Lj4fMY*#ShtZ*Zg)eTak7j)8u>Yo-E-!=;a?i_#;g{<~y^x(Q<8lU!{pY}x6=>75Xm62p&V+|{Hrt=Z0AJz#zn18x^$*pgX*qw^{(l^2; zhTxfJ?PWM6eu!cCtXw_nUp;saQ#^U!M|Va zk^6rn8}03WDd=p(1{}{V{{7nmeOehvP5{E9qN6Rq7v|r{IqSx}wDVlV|LIfNO458o zi;wbtdO{s8jc0iJW6bPQH2G%TuIZYY#jdTnz#7kl^Hwf{dVYSs>|QZ5GjkKtAtR&@ z5VnAC0q6k9-vVuyILRaFG-zEPD;vj`*iI2raUE&?3BmAAGnqFu^7BZQlUOk5h9+*! z6%yw>Q%zBc({}W@m?T!uNRO3&p;lB_c+bB2p3%EE)H~gwa*^6+r;^7Us(F|xkhW`g zcejYb1Tv^_G**AM;Yi7Ym^l0!SUNc@Nn|N~-v1=4ee!^uD(UC<%=~79g5pv2GS{p2 zTQh~7R+i~uZ~^esBaH#_DXFQFy1uC8AnuX>viut4AMrF}SAK((Jn%+Q^w-2{E(;_~th za7mAijp-T~5Gs-&2<&*@UE|9+tz}2zhb-l+%9Gq+xm7{LMCf>6* zI1gzMd-VhGP=f#2&e^%WGl3t9YQ;S~J$6jkRJg{N4IPcnu64$Sk{V?;c0C~3f+Vo{ z3Rf(l+M5O}$;I20AvB{-65SuZB&!WSK$E;LWC>HraT;H9$r=e)Lh~h%!oAy_+)+vg zGxxpm%z+qAdF|7a=|(}nIbkMpCkfWuBLf*XbbK13rXkxa99Jg9?Qi*RxzLM^+}dIH~-llaraMYHG4`a|xrPqsvB}NJ3j*Wn^?9_7O3$AmHVZg~>z9 zv~iqGO=g&P>jEfLEwgT!pFh8;miL~1DhUtR!NFl>`=G3>43*GHkkJ>KmBkGL3n=q{ zt{+PgyI*3dWu)Snnx47*u~hjNXV!W^bA|kwzBn#1;;fw#zViu%_BJ;6{NJC)TJgMi z6|ThdwxZ(JuXo&2)_Jd*X55281^V~TD^G4N_~(-6e@;Un*q|vpk1BZozB~K(;+p)S z_=WSfJH91^!gs>rb3UL~r{5PA_W$@10_Hx?M~|}L@=Qz5Fhvp$*fD^usD~V(XaX@P zxUcn+pHnD2gr5%EANm1>ncd-oDeRq}s-U5KRA$0Zr9w zbX>9t)wDF^S#X!Z;H!!$N zed>3HpVH4a5E!DQ-L>=Q&kKd$EjHZuljHk4aNEN5cf58^Gof~H)t3_q^8{kj}kSmyTrP-<#%Z)h-SS$4SfF|G;I2W5^jc_lT(j6DmyZfNJMyExj01bYiax22`>RD z7W2gGr3D3;+qdbZuU|*HU|59uhK4~jL3URnfQWe`_3-)XwflGPn)Bte*3ABM{2mX$ z1f6oI{a9MOhmM812z=4v(o*10 z2WuCl>n$pt0iTL*28N+x`v{NPkL7oS8^2B5Sl_daI@**s`R+{eqcnBehhdWT)y;e% zn4Xue%|8`S%EcVno^0PI+|7EaHlCN8hQumqz5V|ED`g(j8guG0 zu=&QuBH%H5dVA*-7gNIKD=b9Zt*}f#xXq$LEfWQEGf3EZRXKgjn?7XPH`kar6mV%{ zRg?Zlt5J$VL-<@e#AT2D*HHu$R5%e+2C_?9R*?Z=-}*!{SVb#*aTC1?RyPR4^e;MV z=iio4yyef>Y8Q%9ln0_ylz=({aJ|;4&+W{&R=uY~v`<*(TB1(H~ zDni&idmBabb4vaid?+B0gaMva4K7_7calIh&qjoIey&2X0GaWP`RxN;Jv}_ApwKV* z?c{K_BeKX`N35+xpXrmg>1$jl2|u)hqvP!MLI2cL%(rjao?c!p%eyU366ZK#9{^+p z{{q4=!KpR7cT_1L#qmglN$ttGpbWk-kQ>zE+lu&?6qlu8-C-$SvZH6|4v) zX!lP@yZm814#TmD0C}c;iqW7s{@YqBG)6j2JG9l};p4|rH)7wpq^B2F2(`{_a;0g{ z4H>((LplSV<;Fm)KLb@LK5XfNf`TTPgz@xvDdY5lz5#N)lYiBzkcn4enGh|qUmmETHd8i`cOjH8JKnz7;%W@Ht+zj0)Wam{>`uXYkYY4KO-&p_>26eZU&U*|Avn2v#AIR3rqjd z(DV8yd)e^Ipuji{nM0S`Cy$f)mUcZ9p+XSp=s~P3k+L2jU1)W%lxB(-Z@V}+w4`}Y zk%qQ5vjvw_52%(;ci>0z@SSIghHg0fd4>L=D1-l|uWJR-4LMfKQ0=>EG&j z=pD1CjKHoU%*@Q*(dNX%zFD|h(1`pA)Z8$v>%S zoi&&9g03Bko`SJ4YvKF%7S;D?sY2aPj}L_Mr@-L>eT|LN*u+H7*ejSorgYQnpzF>C z^i4C!vX+CyP*1a)T7eFf*M~=2}<{UaAW4LRYV8q~%%sYCRtc5~Bp2+C; zQ#?@QnwcEIl0FyCpWcLMVeov<(U6o~ogT1DG|A*k2v4gyjJ&gcS3_qH>WxpmDKu*~ zOun8?3)@+Fc|?Fi*7qKOl@^hk=4MX(<+BIuzC{IgTD3sBB!*22T{|8PJ-Pf*rF<(` zMdc8(9*iECCr_>;S)bZCM>1b|(OD`SoXq+m_`eh}URr#HFlnT#-3O~~nh_6YJ zcxTxR)d$c@_oqIQ>JlC*D#ld#Vp3PLO3gR2--q~QOHTr&NG>EghnzNsXrWz#qKR4+ zQwOnpTIUQEOIAJNmZk8D=oFvFcUqP9+9ZHOgcM>MEN~)NTB7Oc=_wczc}e-T-v|i! zW}Ug1H27Uz>Sgycm|o`T>6uwsNzcyCZs*{jXk>KucHPP0aN`$1m9WaY+z9>o0`uqg z$!{lHgSW6U?Kv2rs)tQmi)*LIBHM#t_W?|^gtCa-9v+ zk{`5WUn|eWF`uW>OUdfSNJWZGUfUod$Ml5E2&bXwmOOoh=)wzJYR3;NGfpS~8of%Zbr*qFR>Gz$ELkN`sTP++*EVc_KGmgdP= zk)?oCLT3m_Enh1rN{7ke@3XTOG6%mC{tGVxI~aWMD?{ob5j3~{jTusZS5yd__|NAI zerBe?cy4Xu8mp=ZU>(4b2tB!2=cCJ{>H*W;BK25$k;X6)+5K9(0#}S{pXrDD=Yc|m zmBT<6e(g!XtJv(!odu2UH)Cdv=i-iRW{1qVaD}eFUC>i+EV$6yu@l2>1LJwM9_YBT za`s2=&d$Pso}$e~NfJ8SJXa5VZ$^9{oi58s4qYj_1-*$(+rHc z3VMmrl5I{lHk|q%_gB7H0T`6RaC^Yl{RW$E3eza4~xOc6LPKz~Bp4;!vV$W||%*&;U z$Lax)(~swsls(x^WHVvDWo+DiWoL475@1y@a61AFi0$xOx@;r>I>ep}c_c?iM~Z04 z)LyqwlPxn-F?$V*ZD~Nln3%BpDH4U9dRdqG# zw0utK<5;DX`>^EQOE4>@yL_FWK#CS>QHOh`0Cm5in9`boSHVRYw@fGd--k2 zMWbp_3v@(nO&pq%wgss~SK?8Tb{L~%p{D3*^hW+?scj?At<<_Bt=9xJQ7So(S-J(6 zl5T=Ho%!}H0Y@w`oRS5Fg^ISe{A1(eXV2#gkRkjiVs}BHJX{_ux1eS&x^Mz=pY(fU zYfBAD9)2J;9__7%!bBb+rtu_6!z$VW8mukD@j;WqxxYHNYX%18fLVryhO*zhd0eUA z)s&c&lvP+r#>mL1c`@x~F08f<mp3AMK&A~LhiZdsp{%PyYtet=(c9rLe8Hkl=^A;56+Fnft;SQXSf4>S@k`( z@9d#4C%B-fC}e!~`A-LB=`R;2JjSUlxpzKWvq6%9+OLj1)0}^ufav31hHnQCYcu~)q|A&T4p(~5D^J& zodxs(1R2sE!ga!$g~bU%704oY-zO_?F8T8-l7OaiN`l)A#!<7cuD(ipZEf(p-BQAH z|AHDN3kKbOaJpb|Hss8w#mDx>Z(pN2h19nm-N92M;{Vh+gWFEqI%r5n*?|rD?+DCH zo_3JS(BWWVQT$K&0dgv^Wfdtlvw;YCj5fE&@5$u8rS z-;H|wk8xY}dM>WU_q(fVwdy8=1G)c96CNZnA>Nqkc8v|5-3=IujR;+EoLM?JkU>!b z+Ddb-)Z6tB?b8A4IQXl3dQG4RcIy{)VMNlR8crjSUl}^{-k^7@ZSBEAiO)RVLZ9@F$6T;p4A9R}` z(UlIcu16qBnr&Zt`&9jtf&PAk!9X}U=$CxvlkRwoVbk8Mjaw6e!VXHzMM1$x^llBy z?`L-MIZWBi3)A`++y9)ibDa06(={>*hY8C-o@O^RaKPH!@R7OZe|!zhL!vG zjR)q~7w`BF;?uu}Lt|(Z?tGqB@8;EF`_XNj=&k*wH$IUb_?NuaIP2&`4(T(jVhNUU zR%g$OW}r$U$uK&jMxF)r1sSU43Z^rsKS4F-3rU1kuVogANObd)ZnN4=C7qjies>1+&BO?XCdwN@@1NJZ19Z%*W zv-Y;i2^q3pTAu~B3Th!7BR4cO$o=Fvfe&CVJ`1NKBvBB!1O*mYI47A`UByeuy!9Tp z3=H7i1#eZN{X2x7NLu+ikV;+Q;P$;^s({(5;v@*iD4oow9W9ij(|!@Rn@C>4Ly2m{ z@8t2LZu8BsqgGy*Mx*`5`JbjA-2i3^jJ(B@E*+5~4Pl7D4Qi(faC*>cxI?r9NE@QU zLhu@GyGf_T@sh%P5hqdWTD{ZaQz0nppFj8fz#doKZ!n!)Y_PQZq{xBu;~Gdv{Ds!e zrw4-6>Br-~blDBxdKlXQZ5^DI2xYa`uqTVe%b@}4F4SyPR@0IH{_Y{#-uoBJs4sU|x2bYvYnHdfb<^@M1SJxx)a6TD|iX^Zc2gb&_3UUxVz-D!~7SY(uw{M!}`Z2t{!FB z%9-i3g%^FUy}0XhYVSi|(xKn#|W@Ud99jKWM0Xl}cif<7Zjt$N zZgWtxxx&uWVwFgu=+>UP=M{^lGrCuawEE|T%fe>x!5 z9XTL(eV?`PnT7(Gg{!9}Az<$66WrUX7Hh9o7UNP68oXD~-D|>(4m8D>ag+4Odo235 z+G8x^NXTkXe4oP^QFw7gap+8sMV!mOy>=N1_=YdRNCG$H`|+_1Hd?s;c;texiMJT0 z)l3(TiJvuCA|{iK%MudF)e#z;Zx5ckY@J-cdS&)KQROJGM^yQP;W05(Hd3abp`eiI zrXUw0M>BN!$Wj7xEY!kYmHvo`?@!=iUh`a}0ThnE9yLZ&*gMm!8-=O&o0oTH_xR*< zVO&KfvgF*CoJLDwi%&mg`>5LnWPf%x8rWx0 zYm}jt2L)?((+B2F03JuaG18`kL=UQg>NPgtP|QEeX)&vGIz4{;+JFv9a|@MZ(qI}%33Roorj~~`A_pT~d!;2MiUtPyU>@PkqbA6S zz=}{W#bEwoRyKX0Gm6a1<3q3qQ0-7*Ve12!h2Tlc!S(_KG{3EUVN~v zq-sExBcomRi?_$d>4WxTXtiNwbibGZ_VokQ)Z$HqJY_ISt{u z+^w+W2iA90}Aq|IcrMU|_cgGaxStl;v zRMY=@LrZ%5${O6#eMv&FsO*&!Y0*q6?WkPVKQ3XCnGWI@)R#$ zTIEJ*ZqVNfBhq{*jODE#CB;ttx{rw{#5yJukZ=#cfR~>dcWPOqTtlRF88DuaE^t;u zqfYTm_7@nGEmBba9oWI8wshGicbm48=NPgAc7NW1+(Xp+JEc4<(G_HY zDX&LXy|}&NT+^EXHtnoOWW!y|f^`nWHcPaath}|YQl`-QoE?1Bty{1NB5KI#iK(1X zA4oCU4uXGhFP7Q)WSR*-;!O&;OVF!HoDdN-phMK8cg*@cMQ_j;#dB%Um86nkPh;Fs zvpu+%7@3vIaZPNz8ZXRvTS9Ptvw@q|pXm^8_zt6a6ps)=XV7hS8pVnM7=JO3x za?v_$hr=!Wc&8^<$b4Vu+9g~#_qafw7FSAbx~O@=RYTCzOh)nh%h#W$uBR7oWiesm zc{_PKho?n#d4kDbm2=aGoy7(|Lq8Eb#3mLNLiqhf&8X8KMHTu_cz>Mt78Yx1wjCQu zxgj&G2=^Q*37*nM>SniZxBBkG{0xLtY5{6@dG;OarQF|(G59%{OP-UzHJBN^GrKT< zb9GHkV^UIBp36^ojXOhL{TrJ1z&u|VJ4L2xcDCOO6HEHL)pEqK*WS^?94B)u-&xxx z87fQj?S$M2Z!RKxn^vo@GcY*2|NPv)Kp`BUs0?fg5iN-Bzq zdOi8U-3Lo1&~LWk*1YOn zMn@)U)VgX?0@Be3R@T+`pe6=F4FN5&e3AqZ5vXT~ZI_qSv{bU2@D=XhKvQW)y~(oN z%2`f=s|=+zsQ5xnsrdbS@fC~d#irqPc;gmuVZb&#??3XBgZh>O_5cucV4WbD zjxQ4~idnitF?dsqcg=1_c3BSCKCKh>&G3*nl%JoC^$- z%(j=&cex5m-eZB}T}@8eyLaKjjP{O>h|~&Q4a}AS>IQaa&*2_0L2A4$U5@F-`GFa+ zM1vWHJga`(RT4_S z_s-0iJ>zUjm-Nr?YTWw0d~rglRZdm>KW`?KFei+^aNH?m48~!spYR_3$Se^PvMTv# zPZFd_$YoYbiu!1X`6HJwSwbL2%H<&TI!vhh*5z(~@Aq_>csh(8;DJDl3#TVX13<9D zL?jh^I2~t4Z8O?oIt0ieh@z=0(AIT-tacmkfoBS9+AEdY{(eTiFTZ>0hNifDeI(vVIhR5%1;75xqsh2!`;^m&jhd)LT5dCG@F;|qUh=>g6wCvYa?vO2Q94;>t#q^X?rfQ>60Ut~1&HeD3L1H5bgFZ<9K)#Kp-N`{FfE$X_-m z^yL2#gX^;$#AC`l05Aj zCLY9Q+OSt$1j{>uDPc7tx(GO^e0+d!UVHAUgs`UrBi*K)ZP&+;g*wE1MIrR3R zPKr~d|J!JV7ejfiFoU=U{8N*!&qs-(Gz8mzjq4i^aL?x*NfGlPweXM*1K~j z6fOiJuA$B%UUl~Yu^^@+uwp_$?lKfSbb5(qez6v;Fc}V8zW0Z>u5%_}&IEaRd$(Ga zi;C)*{f#h;4i8E>qq!-ER!P9dSCO7*1PO}mh4e}8=~VP6Z9O4iK}AeRmlq`mM+8TF zPqK5OGno1?NkfV{Yl!J4XnaC^h{`#-YG4oy4FDx2 z5CD& zMgt}TsDoTpMuu(jeR$4N{)flgZFBB6T?+V--Z~fG^1RIekN#$fcYS0u;c`N#z}YZ? zEt(URpld(8blX{=u{7H!TBTYc-&5UFH>GltDT=Pa1Xe*p3mRc_s%hp%@>_8oqhD1^$sKV z_yLpC*4{wU-6}DpmV=G~7cp@bcs0}nv01i z$Smko@~@nv0iHD%dyTZ`;9HpOymV!|hgU#W+g#ruyr_L2kDYY1hD&8YlOiwVKsg=G z{zwg?bQYmYk!tr@zJ}uU*RG^|!Cf_?WFn?%doEqZFiNj=T??(Ctk<&XGoc|877;=A zV|X~Hw3Pbj-)bu~gEIhIH2IJb7|2{OxU3JpyB8~KZW$z{#T@t@D9Jip?!LYgDYC@L zI1*Ps<|F~!;fF~V@UiUt`YXV&*}-`B{6J1g$gJtfci zaNU+J0#0AR1uhK-HgIml#KaU?brFA-`>>lY>&mLKo?rS>hoB{k%PUK5bgij>??mOF z=`+KBe;NHPpOoDfq4j5Vt06{li()QGDq!NJPD{PH;|8?4c>@hljAwOq#|RC%{1?)^ ze`%N<(g86KUkr(NL0DfriG^J~H>}Q%d(lfZP&uEslr{6r`KuGZ=bN;&v31SAb`_UjYdUS~fJT7N z17#A>bPA4KiZ|P_}x1N&}ROvPsf5fc;)KV ztg5O+_YE*CAOk}nMEm+}GTKWfTWhs^|2)gikDOddN-FgG_Bl19&kuxj|+ zV#kqxRa zG>J8OI()?_u$T|eE~SPoT4gStcNBbwGhUzcfYgPCdm;dL;sdE*1k#hAxzyxP{j2A- zIEC}2yy^Ul*Bhp*?+Stc4AFqW>d?Vt3kVzxqxPcI}|S{H{P9WsFdiNJ%JjejJ-0ndBJ?OJBx zMbHq;0mwpw)Hv$kE1~T#;F5GxouMf(5A$ z@)fhP>yN2{afKEJ=z>6GG)b)d>9rz5$Ek`8Q$J7hJfON)S67kAx4@qR1{qN+1v?E? zBE*i2SjBB@p08FypGOgpd0v)!Xuv<6@4RWaDm_Zad#RelcL;(6x=h#_QgFh6%m+vZ zZe&Q`!h>5Du^p{l2gtl5L;(By*MVtYP4CHzQm)m_;h`a@|Dd%;0tx-Q|EY?4Q^CrD zu`q|Rd)<9RCIkW(aaZm7Rt9Otd#*LL)CJUw(8Mj%zS7vWzCcDgpdQ@Lh`x|Lp9s^X zbMdT=8it-@T-DH-WD1hlo4==d?`tZO@F#Q@flEU-`98rtwcYx~vrvP$t{`ipz z1{020+ngdzUZB7(1JC@eB)u2=J(iGs;Z(V#DJZ!~O*IoHLVhG#Na*=(gN<%eofb5T zw;rT4!_$@FO0*!9VdE%c7vh3MX$u5^;l$l1#DX6m|phg=jVUj6_fwlF7q${e8E;sdM3P`u6rl= z%v_lEkYc@z{2=CN35YYq?+a%>$nqNpejug*)rUBmkyJ7g&4q^oMp^S!EO;T;Urv1$ z=j3|%bHO?>yt=wt6o$$*5^)S?s^1;Ff{5lqOdsxF0@w_@a_D>A{Y!vmK{$a8YVPCn z%0K|xTF^&KaKk22S5mnb`R*N%4~$`ZJLoOrWIa2B}BZ7&=;dNwli>Sv2uq3aApC=(2RbO{~bJ9w@3623+w96!n)S9uC1y< zrci`mScQh^u9QxoK{gDOzIpgG#jWry6uwOH<<5J4XXYy9zz7-+pGS@$7P~^J4

    cq+>kKp~oY7c(3%!xe$oeL4+gxfVbZvln=a& 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 literal 0 HcmV?d00001 diff --git a/icons/search.png b/icons/search.png new file mode 100644 index 0000000000000000000000000000000000000000..2c24a23670cdbe70a0fc9f48cc037c3e46ed7a8d GIT binary patch literal 37615 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

      (BN(nL^EX5fxwy$O@qb!#)cNZk% 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 literal 0 HcmV?d00001 diff --git a/icons/video.png b/icons/video.png new file mode 100644 index 0000000000000000000000000000000000000000..4a533de80e80cc4005055bba88420ac9ede5bf59 GIT binary patch literal 79851 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 z zMVJZ>5i}V_(I(x0=m=bO#idSTh~M@`z6u(SLCr#J%J$2ez3=X{S>_JoOLekt;lACDcx`ccsJA~VOmQI?A*7X1)l^nO?LtyJdUBk z5q83HH6u?BE-Qy#F@$EU-n2pcwulYa(c;Ihvrm!p+|@ zZD(RqVv;Rn%QQK=Uo;}HegWP9DREA2R%ZEvdI4x(m{ z#GGUwOGjZWX2I&)g}))Rr}{4W2PhiWI;|ZxZ+-#hcFjTt(0S4);?Ut97Ep?{+Z5s> ziirYA%`|oCq$ABsuhTIp;9>309dV1|`(n4HrOLUyliB-CCM&{cSz-X4+{nk55%juzLyMsfQ%$o^YcI@Q% zKQRE(-j>WHZk^UDOaK&oe=5ntKPj3~=D2@}1zR}lWOg3@c94OqD5n458lnnE>TN*V zA0L~5RILsPr2pM>XK=?O@(o<|#*6W~+0I-6F8lR#LRLdko#CpS=wnolL6_B^mh2Wy zkBJc2x+;`HFI&i)>bhKp6>Bl z2%=B~sE(XG%k8(tQ1LTpX<45qLuo#^m z()gq)bwiA`;_p(?OsVW7&j?3fjvat3@KgaQC+2XZ00l}k)DW$-4DPHOWI@k!S6zd{ zh#6TVM0o;+Pb591Gh)!E>QAUi>hCRjakQ(v)Beyb$1_$fgNBAWjs^s{S*Hk3id=lr zh=Vfw2*l`k$@~b0L_rg6Pxvfyd=BV)77-$D{XpGsx+MltAhpDcJXj=k%;+x&z)`nuYd1Si^NK>k(R6rY!W zagA|Qfw+KQV+I%rQ(Cay`Q86|F!ict06gd;5?;{J*0{dCsTME3d5o>Ew7%^bOi7D~ zlRs=bhZNCXvv%z@bOGq1uU@eNHf-3yn*V|eE?@v~di8~)G{Z_HV^~xA3cwUo!(+#( zShq#rOQfJw&VpGO=j0Q1P@(P$#%th-&Cj7dIRuNl=bohV5BPh{&CTq%vZA79Acr<_ z??68UDBTwYn;d#dI~Uk{uY=#`m;MSl1ArfwS!lTN2C)LlAk;M0=(?;~pw`-SzKGV- zzGk=$m*}BS{s2nNr50lJ-SLr8{$4~rS1m7&9_eA$L3X<8TBOdKiU_D=DcdQF73^X0 zyiRy|{~_3ZXdj1sxgP)uKWS|84^VwYCOydvfQ68K7oz4u4+2`p*^nB8LVH6k%xo`3mYnbdvX)I0F_e zSl~3Jv<(!3pkL;$%L+b^1I|9)STR-QRzxjH4nkZ7`9K89HT6)QEVDgKtA-qs%}q_P zZTpY8rd-S`JgLlo*nyOIVfSJPq6VYHCDKk$q4uY6XiT*Y=L*K4JSP?}dRmTDv_oER zqUi(@eh&Es**_qB6A`BVW?6*)NPCiYr_cDfHX!5F+mlA6=TtaD?@?U!@nM!>*78~8XB_E9!0kd%t+-61 z8SLx``xCPH5)a+jf8a2@>&9zOO8cvQ7#kaf+WLC1QOlB67#<#niE&XFLkpekZ_?@n z07U6&F_Ke|oObNoqnUWcB1;&1!;3|yEO>099`_x?R4xYjuF;2}>_+z^*zb(&D6vY&5 zPpYtYUFlPpB{+lIY^Uigca{p+oIQ%?Xg$99pRY;)pw!=3G(5ejF14B_{ZPL-%Tq|< zXns#Ruq7weS`;b32ZqmITDoXa2WbAvHP@uUdbvJ)>CZs4Md`bADCTGgWTm+HlhIBUUDeiCiX6g>FI6VTq)0<(~6o~-bb zFtki-$891&(SD-#fBwZ?tVt<J614!L=AQ(Q z082E2%|jGzXHE_Zp!UT5Zb-)9oHZ-qo_p_ymCKjH8!kPcrymj6>C#!@wsLn9emLx^ z%o(ZO#Ta180<6j&2!aiXn7`#5ye6X}`jpAhZe^iE0;CgBof7&lNIe=NLA_8Yb-$W@ z0C*k!t2;YdX6j7;^B$+4C0py;oSuThHWqedqRNZD`$gQM(l3rP>RFA$XNy3))DCMItQt#0JQRz|O&Zjxz~K8xpIa6GDI?G60L5Nl2P_Vr-0yYr?TG zYhPe<0nbCR=P5*Lz52PfA8FmttCb3%+0bRtNOZ@{)3g~O%8bPc za4@9hbH%0~-tpMEw@F`vR>Hle6HT|=IBjKC>p#>fI9%Rxk|!Y2T( zAHg$SSiMhvfWhI>hTm2A{~Q1y8I6ROw=~uumCW-66l3{Ba!pzJ0F)P=PFh(FUC{(#&OCfn}-3=Bd~-w+EHEjps;6#gOsAYlw}CnIW>G0COP zJmO0Zx1`Ty%?xMs(R1#8OGPHK(I-=And!$#kvxV=4L5 zoY=oE2Y?2-0ZIr|tGGh00L|^SuyFP)Sh-{&95{3Y7B89)^X7E2uZUBMow45F#GU?sO?uG7MYKzKa<*L<%?z6|6PRn z%8uP6OaV%#bRq!^1{Ta(FiVffRM@Y4^{epJFMWwG>TS2(1~=Y#qoZ9l&2{eBo)OKi zIRKT-96b?Vq;L0~#BD&W8|J=O?lx^2pCitIobKQF@hnI6y ze3Gne8(ESq$pLI*XzV661ML|zKsU_{YnsLbG+s2_?qOIkCfUn2jd8+q5|V6LShk|2 zC+X?soI~Y&>&A2T{NKO#K4+g>_2l;qy_Vi9ty0yix^=_3`_JG1eU4GP%|Q3xF6W=k zc=7`NP;}zNIX#}Ud<9Q{RVoT*EQhEBd;%ggj6wGY zG>?KiPq&~N-CXo#oM=fm^0HgODfYbH*N4+6u>oQ{hiD8QJ$p@T#3x7HsBPn;P2fEC z4))J5FW5{^P8rUyW)o#u!$H8~^Lelv*3t17e~O6X}8@47A1o(q(DxiKDY}Y)OhT zawimRGVC@Y+s;0gmZsRCpMGfxrlL@(WellDN`yUtIPA#fWdz*J=BUa)M^p4~ z|Hl_Z_WfP&d4O)a=~~Vj7DQT&%w)tZH+`3G%+t=m_6M-C%&#HCc~A9fECF&HEqAP3 z*6SgC#av&DZQ8Xr@pt0`-))J=1Y(1c|D9z=CR z0vKhpH;ER0My@*`vVF2%tz<%x^8Kh^gxkXSt%{Q?pDtZ`CkyZvMST6kOe!rI$n&r6 zrGNOw<8*FhjIV83CJ~(-MYDXRWWNCCwxd)Kb|Fj&K%br+=oh`oSNH6tmv_C!L18of z{_p+=>g3x&ZCT?33@9opH)F+VWt)=b^>ud^RS>p*l7IQRtIYxQcbAGc4)%4^@aU98 z9vSsF!^9e}mI4bC^Hk~F=1C%Epuq$5H-GatG%_+8)rpYI_!{jye2fitL4avpAXI_YAfF(t6Qd6T zda*`hTC+m)wHGRNI0^uddU~j}Y7Nbe4%4B-N9Yg#_|ND!KJrUKd|E*!pkh){TYCD+ z>=>ltOf=1(7-=?|_5Q1B7XXr9UFG7<>sBvYA$sv3azF#H8R|uxP>=j%HY72pRD~h%x=7_k9zZbA?LVe)6FdGw>RZ}%>4!W6OU)V zM>f(jw`rQ6wajB`wBj)P*>+rF$q?fYI<)aN^~qf0D`SahaY#c@oh?UziUqb{Zma z3XC94)|In_BOLM353qzIa6p}%CF<_!l;$7Qh0})hcFC1sN@%7=I;xAjgrfLHt}}Kr zu=r=5bAMi<*Av~&Bg5E3Nik0=X5#!^N|>C|LN5EUKl>Ct_ws8}W&m(yM}@#yG(}*w z!(7);oGs1)oB^_=qM=sf)K(U&)@<7@nb+RE`{<8^j==_?|1;uKvMS|J|VytD|7-?UPKqH0ZUDs&B$vN zq#wR-G^F{5W?=&}`;u1s1st{@uw5<7ZP9}g)s4YRI?YZ*j{_TWn9<(C zp6(Us$L%#+c3}0{#wl*Z``6a=ylBGXW?7C?@SN2F&vUImzE9saa6MW=l{fz0PdEmh zVOe!va+G=O7T)CaEPeF9euB=P9~Os-HwKwh&KNu12Vo25YzIF_sv*qMd>&A`p%jE? zM=+`xaTD|mHeG*%+}BYK6#wPpf6n)p7H1PHD%m9|iq(buSc@Q=$GA}y`QPQM$pIAj zBHXxQsMmuGlSF@O^k%jypP^oA(Z7$gf>zj~ZmxOphMYWgl0N_W&(q$0dubQfTv++E z4xk=3X`<@U_*{x+>-bwva`zq5h_V#Y?tgSipIY&D=c@P2 zKftPrX=coc2HIRa4vf?Ol?U5~^@h6&!fKelQu~Wb|9Y%%?P7;$WE%%+0QcXlt z__n3)E*e_BR%p%k?A=eF|I#<5!I%;}ffsKQwrv$!Cjct-Mypk38#r}UH~@kFcH~#~ zbe6YvvzG)F6TB#*R?9H(L=M0(14&jO`}QsQUZu4(SCjw!^@ks(Kl-CTq7QxWgW?3N z@gqH*Zr2sTI~njdI1!*^deAJB8Q}_g6!jK0^^tHB{Sxt9Bh#WXGf-+XQUm6 zuOpj4jR7x4TFdt@+kjk?f&plFWQ@zLRn*_xlQ7Q9Z-00f6-D*h9fGms_Q&(w^dT|r z@#2W@mMC5f2m%As-+kp#I(YP?-k2m$pv^hs0N^x{8KEQt-5Pin!AR5sM*^IsueTGm za&c3Wvzlckp^@Y3*S~TlJA!UGvk!mm5h07o8}y}h0=}ag=>9CDu`E7k8Jn+`CLq5~ zZ`D9wSFsL67gBdaY9TBxmW?Oco(iJwwjB-T^JxKhfQas~M;{fZfeSa#-)|_g(frFx zW5q`)fT)RanTKe}b!!&OGa=1Xu|CWtMY=!@l@<_EOPWeb9D-d3rTKAEl}Yj9HqG@@ z1v(ffd0_**Gt^a{yT?eU9}=AMM0~fGXTSEEAx8NBQVtMFiHUjWwVCu zw;^eM%V_mU6I6KjNm5Z4$f*I5t@2vW&uTreSb|Arj0x_27m*IG5~Xb+0^9w z931GQfxccE8=s^*@3>V{jj3c4^-{8ccB8ldUi9^%X@PPYiO%@Y0DO|yI5~Z=_mBTR z^W{fqFB`vwB^RWhBE+0B{}(Prz83fy41a!RE@E94UIsRNr2NRf77Rh^)Z~L69AWDM0CM2J()0`BnSW@JfiV`lfH^fX0>1Fajvb2*U2ku1jHGYa8v)KmRAzHb5Ieq85 z<v`&ICAUsVEj7Teaxlo`IR(blo-d>b?WiFhD0<2a)(TE4uhzN9#b05sg4QpU)Tx zZQKtWL>;TXSwkLLtw{>2VXKOxd|B)3WwL@D0Lm_v$;!rEL&!a}IB26@H`9PZ#3;0V z^F}&#<{V8=tJC1me)|K4*)i^g{5u=jSSB)mYQ9Nd|xsX-YE{W2h`BQ>7P_q%li6qmbJf)hYb0 zAqdU1Zl3n_tC@)j52e8V1IK9Fwv8NkS{i;F;Uba~4>%Og08@U-pS)T!fI>c-y=CR{ zfh?3@1$+`2e_-(cDmnj8{9BVmLNW{v;1hrG7j$6%el3fY&(q}Oq+I;IR2Lu8S(-yP zm%VhpgVXwjS!yl}(*&+@VFgiVo;-{T5%G$1)bz^{Qqbo&CcJQ*RI3)_+U=@n=t;+S zWOR()`sO<%O|x=Piw?T8V3G`3NrWJpL7O+Mrk8f_k%MRfJ8}$!{A596%2A?VuRjbl z`>(O|-LhZ%o6D)RMibJ3Av!dWCO-18`cBfH4Ic9;Pi z0QX*&&^R|W`cs*DQcoA$hVbg09a~=PjeKVm5d_p zD>USHz}X)=eu`$;pl-VHTI0aNHYziUN|yGKUxIMNVVS*V^9EVu(Mw0Z0C-3N%dVq8 z0v^7{nl1z@>H^!S^}w-+G0g&>#Vw@cl4#b*Fu|K+r_ zlV4CjaMlx36|T9P@k(x(jP?;>r^^qJ=GtATz&H|e8Y-IW{NIK1=QU!^eC*lzxUQE4 zEHXfW$I-IIHGg)1Jg(0WwVPuT8d?kz5UDS z(9vTOaaSxKjP@6jY5nDWAi}O*F=Uo)^r3?wr(Nw8AP^fe4xy&O&P9M7`8_fLLlRmQ z39O8$=IBF}lApMO#Url*3@x{#u+Mogvz9|0cE*f|V1hQQ?f{~s)H$wZ4or*Fe5SrkZX`{b@DL~C2 zDSb)nbs5kSHl>2R7j`+VB~(er_5a!{da8;B5d@=jk0c^lUnVYTXuD<0@UqbxD<>%Auxh+ET zkWW25`^?jFvBCX^3tThnt%;El^zmvODJRe9L*eHrJr7||uHC9l(-Kb0Zh@BtYfwNm z$K{sr=?BrOD59x`2KzKP*hi0k`@6J!*`R=8RH$A*0;;8e^3EG=G6fj;UANvuFTA`< zj2c~KPryHVEmkx6G$M#F2r=OZV9+wZ=O~5jKo)o)?6FXh0}T0eY|J6ewX4UOtX^mJ zj3l`3HDu&4qYQvkK-9It-e^)5C_(0Ktm{9pa{_hf1^J2NW~ zYF%z=%>%(iAoZ_RBZrTD16)V+N`#Tv^cyTpT0@Yv)5JsxQCw$GB&8|dBdsbWQyJ)3 zR8$xgj~+XriCj}Dry^8Nc_V-sk_v!-|J3vQv-jM2P2);-03Kh+{&F#2gy*a^>Q2O` zi|_#Is~y@X;48g2#0UMa{_-ykMK;l|{o1dI186t?#pxy+#lkdc5=P(5gOLW8$S?X- z;Ci7}nI=`MCLE7v02-Q$J}U=i>(Ka@h&w=2h7tk79t~s-Ah1Yz@;4G$kRc$$ z$mb2ql18@Ky1F1^LM^z_*WE)mU$cdtdG00Z?(Cw69(bGK&!$lj2)z2K?>$GizUgLBSGriA!CT_1YR?j!+n+wq(f{yK zX?ogCNOb&X*m>iAD}5IKb$Tcg>@2*xh9o;U25eEz9AKfF&(;pqS=aknb_3y zco9v;a%ad+c9H{M@!0W`G&Ma#{e8U#;N(1i^Q2oX&7H`ny5n+<|BdJXP{wXwE=sVq zNc|^_c-PEcbf_*u(kVK;TKA6Ye{1lT^4tEK{5(HUD;msS%poLZ$=*EC(P65{#dcCp zGpfTIG*I?v#mX|xafz_N#|8;LK+rUaf6=De5BAk8eHkU73L+ z8$o%32rObIChNd*63P$}&rEBrLtIm23MWsUrgy*dele6wiZY9!$X-M(|GgJqqe`X9 zuUkuuLv%#Yeg=c0w=3&%?NLJM&B#{N-?7(PMzR1A&CW>!75f%g-~tJ038k9hRYYcr zpM$Or%~y8p-JAuyP_4|bVJG1qK5|-KS45HKC3hlZ6qwFH|KdlY2Y=%^0N=Z2*-#%% z&sLp9pT+5aB&$SmMj)8^v}O(lO|^|KYuBzdq7i|NOjBF#<=kt5JWz}^s^r(Wrf=}= zL)|;@h}sr{+JGfXItY&@C`H|kGEE#kO>T1!MdSl`&)v7v-u(yJkbMJ!3M6{h7qsX{%c%co{(lX65>gPzVJR(|+Nf$#5R?yE zJ0K&6Juo$^9qaj~hk%m7W@5k&h#)9NS6yYg^Oo!Ai6_1%@7G;-+?-T9Qj61WH~Ql7 z{`AlPn)dA3C&mS1(_>4GGR&H<0y)Meo{=pR*sdn-6RgEI9{CQv=Uw+{W4VNhgPSo} zQICz9*8vT!W`Ya-`IFBoBQs%dI{d?0$`xdefJ9Z>WB=`Ciax#kKM8coC8XN$Z zxtXC7d;bfwGkTPj;Ne$MJsh#}MocM&XU*3aA8a)L+edzthKGkm+S=Cte!i1Z_&r#B zG9|tOMWTEUdEs&*b_iaJ-^d1k6%D{SHdOw*ut~H;%g>5nqGurJN%Ta( z<&QBtlO>lz>6tnMv`_suH!}G|&@3DT8v#Gw3?&R1l%rtq3da&70TK*yuQ& zJbjLS{UiU2j6W09f8OGqe!Jj@-T2@C!~aH;Q&VDWvbAV91=3>tn%6Ir*2JaS31p0@ ziv~Pd9tb?h<6OJ{_`BaO5bR6E8rb&_-Tl3XPHK5IBaH@P4>B2&t47iEfLd~pJHzI{*{GsfmfHg^U41A%bgQ{}PGzhEODKE72jym|{Q*~L- z4k_)WWBx>kG93R$qn5A7$oGG6F!k2kw*^?p%ZMQLQ=_$tf*r{JBDmCU2H# zLg0r>33p(~7kky}HMDxoT6+1V7vuULEG|%c5lQKonN}`tiVttPzz(5HA9{ce_`UF2 z>;%s3;s=Nz>v`B!fD>Sq>;BnRXs|+v7VDNTStH;C7{Ya z{EHu=Kl|k0@_}l~VQR^Gv;KSSI75l_EkpPzDXg#rksMf|?hZ48|rPe&{~azqts6c!{PX zvZQ}{;YDqXCNskI!s|r2Bv9O+nDX1OfGZD%D}8Fj);^ zllP(-^*!+V?fb)zQ}#3Ike%B!KgQtX#H8>DBKz_DWD@}2*7$dw3b|0?edS1D&Ogj!@Dib8waUwCJ~X5Kw3lf&4eBNwtP1gp@u2#$OGPL+T6w9=74- zg#8r=L)^B8+n~z~!bUzs^_E`nk?*0F+u*Oc0jdw(AU{WqiZl<0A!ydcXzXqQ4&~}q ztAzW15E4{?*`o9aRlLX)>V}~GjCusl&q5<8>i%0rzen>Z;4S}exU z(l`MtN-An-$O524hu2!GMN35uX|(E}w~T|R3SnwW(|px6=tzENB08>ZZ@EnO+)wxi<=CINVEM~|P>)Mdt@dhV`6M58WlEx6)K0ANq}u$6_5S|XPd`J*>9$&wmT zbmJldo!8`_^P6*M?;c4TOQlXZur>o|hFm|wSTW-AV=tJj=VQpIG#1{R0H2Q`~9Y(Syj>}xhPJ$I|6WzD6*1!ZI5PfrPe zNXiUw*x7vt;~ZevIG_N+2r7|pc;6j2(w^7$(2-*&>0`h5+hU-Jk|n0Gb5M`^b^Ohz z{#I0u@qE$j6S7jQ)*7{87&MxGK+)OkK=%Z6A3)FFbxJIbztzyu+EALGJavYy-M%Rj zL2ch5Xz$AMrQ}O#weA1FQaA5`9HwQajkHT z(G*5jpmi53(f!#4F36-vf2OXX+=2X!biwP*dOhcB2cY;`c+F-r0SiWA5K*jZc!Wkfq<5b;mX4t*f=#g)JLzsZ^@s_u|CE5W< zDLy!G04j7kk6t8Al`u#qGGYw=O0t?t zm3n)+6P$_mf+Ev1WGCJg?*Q0)F6%0Gcv_t$h`RmCS$?pFuN;9z`%!JMH%)uu0ATzs zLeDk<)0E{501FmDgbwp4W`<1|D(Xm3FU^iodEqcMdX`b6ZzDD4&hxuBFBi`X&~$|S zw@1rYtRR3l@Udm{2H}DWLI7_bA>7GdUlCNp-J9?|I-J z8W|s_Z#@2_-tv>4Kup1vlBJY*r5J}bolWUsA;wzxKGfI=5P_n+L8CBi>6#SA7i9(f z*tcD~i8>28`qEdvN&oTx{0-W=Wql-)5tsT-x7vZO;k$>w@(m%vK(rV7ZsP><*62+t zpSShDkemQ&>1Ep}Sa~a{qfb&cMB2&z1~YWNpUzT=PM*FXUcCgocq>*ic0oQ7DTSkw z6BAdc#C+PtDY*B8Org=xk>ua}%=?9Be&_DJ{JOORz&+rxQz@-=m@?!acA3RqLjkGy zM!^^kqGeERfo>#{p$Nw}58ib%<@k4B{>mftd;jUTXx-YCre_L)x%@E!}bJ4nvsXo5h;Y zlm`uI+BIrTDGR_zRA%FJn}O}1#(^CGXp~+IiR@!6?4f%v~M^jarjX_h76wR_4mm8k%m+E{ia-93O zI2fkW#)&7kmXrf5SB|X3mFxi61C$C7v#hnE#+Ra`6c@ES1d4wNt^kQvTzft6;5#`L zpQF*y(a88QHVVBo*4v~6h*v{h+9=})P>^vpk(!#IfysTuv4_snN~+C`k?LPdG;}Mq zPCY}-ut7OaNxf1R_4oJFORw&uzP?^*T*cUfWVhdbZ)vT(gb;-(3%qzd7-s_(E(xo% zFy@9Z;ePn%e~Jbl0AN6$zw4*3J@#$W0XKvZvT|BClwTUEOrCEJjV=W&+pnaurh9IU z9v^+(oubk^J3ULsPL0sV|M>r=zTR$=K07PSCWBG!BTS_^62Je<^K2YB>CNP_HvKnU zex&&T{D988t1KIpaKcFWk%ptJn&qtS(BWfr_{cH(xqtlu>g>?eT(V@-^2KSS({-wY z1cgh1X@0(N0B#RpsgLQIIceBI!vQwk5Pn7UNUG-Fi28cvId6Csbdy!9`qWS&@bjow zH6jy+4|{|&u(f~C(yQCT-fRR~(X568L+Jqrp-Y5tAq<<@QX$_!#R?Q^U`mWwMa_#a zCCG?SwsrTEj$G*upwQ8gUsdeLO9^1P|H+B)(Lrl>26mJq^|nHrnua(X$EE7*?54A4 z^kRpfEmDY!9yB9EGg{O!@0{n>>KRJ$L7ifU(gCmE@TgJf6Xsm6XAPg6ZPXm!MRmTv zIsN&v#Jd;>%J;CmmW z?#?nj{P=eSiHN3M#_XI6T{RkdPysS*zDS|1HXw`=85I6aMp_&OwSE0+dgz|J>G>CS z%4X%S{;xkTDXUdbjuDZX!yfP!F9I=n(R=m%r=OR;jzFb_g-BD23CuU0HX@~2+P-ZQ zr}`Zny{j}cyCBTF^A%(S8I#!%%}h_z-+$p@`pAcWLF*5qDU0+v-7;BDS}$`6KVlMY zyu?h9hDXLtgbq#PR%a3|Y4&Ng_g}iw9Y9xSsbi?n zk>xkOnyB&JT3*nXx=3dirx zC9ezk; zi>e{H7=ReLidXo9mtHZEJ}X8qU(@O66Ls+o*KLECi@f9#mo&#tzCx$ZouiFwSJAW2 z?xO3iy_U*hS(;~4>;xWt{GaHj-~TST_CZQ7*~tDrrW&I3eDS>lw*h?k_;Ec74bkM& z`U=g4zP{+-hcd>qg=7Xu@b+R(D=fCmHY)6iR)=<0(FNOmu>8XH2gThNqiZKc-2 zu%*|GTTNS1V05v-7m z+SD%ylKlYB)PnZDfi|uM4KdC&tCrJ8e({6!+TNq|Zta==*C|JdKP0ne|}h+jOk1a z=8@5!!TSR@v1auOah@==hrjn7`r0Gk;u2?phPQ5}hu(e(*J#qlk51p-xLh_lt}` zy8E@z>}oW{sW(LqJrqnpAp8*x1N_NH6z}zx?g0p&W7-4`88tS&Ov)ea?(Xb9b8c7_ zvRRn~L|4;`+W~kbV9n0wGA;gD`AT;H^;*4=Ng2l3WYbTzMgPUrSxt;rWEC@@>4^#Y z?i1gVpQAIMGIec=Q!sG=KyRtg8MmpZDd(BSju&d+i;Mu-KpF#U^jm<4E+7seA0V&T z%f-t&E;YJndTyTU)On#E3j{>eGPCcbF1P?V+>%iT37NJI{f2;Jfzhm+OiR!>kb{O`EY^%Ft-__H@Yv0>6Ke zGna328B<%Bmz8Ufx!!o~HX&Deb=PZj!wuK-+tMizVi2!j;sTLAVb?LjFP1#Eja|KgMV5rje)SZh^(h2((wEN3_{k3jy}-4%}|eB>tSe`uz}75 zTY4`*a2G=9UNaeoL2Qa@wG}Z@bH#kVtE;m!hZ10DXi!Ige+d#)Qvz@y7p6V$?3L~S zik#{c)8>tIwf5R`Ikm*PY%^%+9RS&buf>i5wVQDOAs1s|OYaHj#MyGd8(AnQ$JnSL zJO28#%k8leEcLC58nIqD&ly62{AHV|ix2SZ^o(QBJK>BGVH#8lKK`Ug>pZ+8W} zDDtbw(1W-P@Zu(A`y!I({7&};LfN6mzWB9UH_(mSHwm~3>!pB}YB;anXd4>ri_m@p z{XK#-#B+ywEeyov&{s~6B8`7T?RzXu5XvhL!`0u#?UV8PleKHQTynPVlyk^^G-GfkiGLQy_p%s|y>!P4D zofU!>y`TkEq#-Bk(4lVN83Z4`wzLn>h)QYjX=0B?*fj55U?wj1+>kI#MVpppWm}w+ zVF&`sP}=uqssKm9Cvd#GvviGboY*y6HzzW~_SYZ|!1qEfeO|uO9l)}lu2QG;SD-$V zDEbpQ04?DY!~rzT5>VX;W!Qc0z!*##^*b)UfwhW7nFgRMI3Z<#GQ9v97%CIRRos!s zdx!2XzWNh&K;aY}jT;SXl?5yhI6L*=$_C zdwn?c_Sr(UA$1})>p;_O6Jg6YFY?&n|L0V5YI;5)hwYmlLp++)PBC<`{&ok!ad6h* z;q{G-j0rD6#_aV+UH?o<{(WJ1M7sYl7+@OC4_^?fGYy)l%4~jSW=fWGWcnZkuRVqz zKP`<-J2tk&o4(=TOO}r@$SW#S_y?!Yp4X6ELFeh|6SO7p_*yp*a@2O`Kt!9>o&^KO!k@Ne`i61UyobQX1n`+7YB$#gIa;{w=1tWr*#XQ}s*EfwE6Go7}bFJK3KQh2*>ru&ARHB>g`sX4?U_1Ya zm~fm6A|mu# z%>$5##^!(oDk&_foP7a~GG0BPj&3&k&K{~P9HFkRPRe8Uj>QzDho;u|A}VT=!aJ#` z-_}fXqkia6LC4$2`nk#6-RQ3L`}qZrAjoKi)$)y&_!WsGj0 zD3c+@w~e9K_WnEp@W9Yz*(XB#>DnL8ev*wIKo)G%RSlsjnuS41OK71{s@TCo)Dv#&P&kRw_dU2WJ_W#|gqP(gd)LO5CSyGV){k8`rMP@N>w_%~!k!-hQtc|M}F0 zsx}!1*1bdAM}uEk^-3=RddtOvCu_B@XZRO!40YMx4g}`gsA;`>&(~lOWjg*{T>;&) z>I7}_PSI1ZWNGC1HcD-~mHeSW@%SVFp+H7ovB886a?jTdJ17)REWsXxUZ_%Y7gQ))3d$oC?&q7ARMA*Zyd#~>jG$6yyn;-;aB07+5; zgj#Sih9=wS>GT%Nl);ei$nQe8vmR2SF&H}m{ayiFB(UFnE++S|q#v>qkcn2cF)PQ4 zuYi_9ke0w%q~ve6Z{13hlQT3lFhG4A^{e%!JegugesPNE#o)1a4#0L&GF*oeI1WN( zKvPv+vx6BalZp7-ZLcFRHJx%YDysotNn7l{wKz#S>esj!4k>jpR+NmlDL^Ou?S{2$ zN+Tm<9ws8!Y~P|a1}+l)h3K~4Q0x@PZo6q?<4Sh`Q*)K75=kX>>4qPTL&8?n12}i; z1Px!fpaB;_E1JcB>+p7Z?D#So$R4GYt41hu;x#(E_W%WFcaXpJW}-}&I07$d=xFUa z06T}#JHm078~gKo7_)|NU+?9cJ#R|{B59v#n&AyagU*1QGlq{YDly_tq^`Y{)<3kJ zCvoIAo2oYe7HX3z+$Y*n{^=nu4J-zf8@s78^{6FYKUYu1%peU99;Z9*c#YN#FVKn8KcIy(C#bUiA*y+O>;Pn*#KiqJ+&bNX2&ate z(d@eXv(SqM@X4)3%{Ab)5${QaiQvP2lvTv)x3(Tu^0(6Q#$zQ)22*<~J3IHHDF7~s z{5%??deKITo9X0?_^3DnF#bpekP`3_YFq3m0FQv}Ib;Ik6VtSA^%@!(8nlAy-93BvA4%k<$0^#s7Ck9LOdr#%PI6vlMVUQ)g)G}?AvsGJ-&6vsfusBID8 zMU>H|`R80TJ;n&-My@Ka4;#cC}Y$7kVAp-oLGHCr`@q*39e-ty#H}dH@Wn%!|}mvl-I0*KU)ap~S*x zXQ?P)r>Nw2YkZ0q$=ssZz6RxRE8sSR{k^nq?OM7pGOBkAxC~6$mI6kN0yWfZPPPGx zX@LHkHgf7|p`imZQCOOzk)UtLMD-qk$V*~*DV2(NE<97>-FDLrsoi@H_;4(5zUx-$ z59sT?bV7`vmrkX_A9WAljphIrn$1>)UvO41^{vZeIBK-?f)A{&e{h+Mi)LqM6AK|- z)p@E;O;EZ}q*gUgXAcDQ6yL6+KSSp;w@@(G%c=ZXq9PV&vN6dLQs38}pm1ux9`i&p zO(~-@r)#>pYC02h;2=`6h9%;nMO@nCekK3kA zGcPcY8Eub6tG{t%7lTzQ0Vs-OxI=f8=(mmhD9!}z9)kQVNNzI9d5<$2bnrt%U8WU> zbp0=5L5{lbc>DeI7k~9v@_tQE&q&r#ES5OhFQZC5pw7+?!7_wuR$f0cg=@F2Pe7uT z8{$p0wfqU5!zn?I3Xt`a=p%G>cGCFNwB}Y+I_>t%dUO=^%{VWU(eDA!)gm+tsIKov z$VL_F<(_7v86!Ilt+!nq%BD2os*DvmQ(dua8QpdJEggUS@lW{IY~4yjoR#SD-$jO) z{HvMS3Yekh-n3)G%#UhxZwO96@BwnVH#sv`@j(m`1mR`hM_?ty*+4rwduZi`&9r^T zEs5LY&|T&?7d!0(R3mSEf{q^zY46S=1q%cGj&@RO%A-R4l+6F6%Zr0DGfKhae!+`d zZa(Mu`wCf;PI!XW;C|j;KT#N%42!|Y&H@>RZY4s^xiEcGSjh+AVs%r8Eygj zxhW%}`v+nT>!htv_aWrpj)tP)R1A%bdh~s$3`b!Y@ePI!Z=opN1Yyk07$*PLG9Jlo zgP6lGaGn=FdwY7M1jrbp$5$xwjyCA&gMi55%S-N z><~*uvkpH)fI(ja7!v#&Qwb>_JWW@o8^5WTb;8v0o=zwAc+o71LF?d-TXv}Z`w#nL z<5TpL?|Y{i{k=ZP&&2dRmrt2fJ9iyVUGW(JfK>dVTUJ2vvK;_MeM+P0A~MRhWssqv zWmM-2+>!IRejFgbwTaGGrunhU{5?nS+6;N~Q~ai~XI;@t)v#Mwfz`Q#y75DAxRyOn700SMYq((DS@R{jWp9QU#*$3cjeEV&0lKJ}1mtUc&$qC~S1A#NoaAvSjU7+QIee}@% zcguY&j)?InH865=2`+L2ShD>WEx8?|Kd;@o(MW!0g%nhI7Fn3lqr6aSGT=xFcVI*7 zB9PezM5dX|=&4gSr=i6eqeY2~R)fv_s2>%Wz5&kYsuj!W{vUfYec?-Ar#o-IMP$J* zMOJNebcR+8^*-^>Lf^d+jQ^{D{ZYkPK%Uc?3a3SVxm;QnQZDDC(Wv`rB~cZ#LggJDpPIuUP>=;)EVJ7IyFuNt~)q@$z!?+XrRN^Dm{}! zZQ`1BdU{&!d%zs_(9oCLLl+oP2~x=>RQz<6*`p8jhM@8y1B)gg_UD0$=J38}8;6KI zAe+#QN8dP}&@+uX(vCpp+@4d{o5(54D7MLH(U8uF(2p2Y%|etk2z8m_8{C0)Fo9E2 z;J&*$yJ##sA)W4YDl70`s28UVzrUsVx|gHykGga#jCebGV2^GTab1_l zGE8%Dwsn^Fzw!@;1RzVP@jeR5E6A^!;aasoYCKQgfN9WB8w-=8G+SgRpHH0?(ndt4 zk&$s(z_CUil3Kd8V8p0SurS#(S$ZE?TZRfg%1@p z>W2Eegc1u)O|Z>iy|{*Yyjqvnf!EVAlLT=FCR_0hMY=V93o63v>E<%2UK@eNS{SDg3croY5{@C1bYF#BhaUePP4Firuw(iI#?R#_U3Z(JLTOO5x299l@rDC( z2~ESc1E)&^&twuRDWm0#r$S|%hcPq_XjIM^&_+023s_n%rA#DNrW-E{KOP_66fGa> zrD8`;Xr^A;eTa>|LKns+=-8<Bx?T7&HZuh506;>wbccq{2mLMv%U{1!b=8BpZND8xV-vdjQ7LP~+qM`_TK|Lx1!4UygzhntMT7*Yj|QfG3luS%1*; z5!PZ5fcR+v4{4SlFa(?OAeWNYoXO;5Iesxd9ud?IZb+tGE1drLOT;$7tTA{N_+t=T(M}Uo_Bk)&T%PDa#J`q8U>w#fX zQ>Q7IK0_f0Kf~a45==MMY|*1n5xumB=%IHv=%Ke0_4W3MRF_??Z8ocm?f|2}m^f2K zr6~;7C-?Ar(SE&EL2_4qty|H&1;7i$+j~-{hq}V?0-w6ddFt=&;)v5t2e{7M^V~6d z`QTA-p3>;pq!=c+3}BQnf*FqV)yZkvckBc;=AYoGmZBXyuBW^2yn}AIemj+l$adz1 zPFwm5zJ&|x1th^E_zq!->B*FeC1GfiXz!<@QL3=}`ti?V-T^Nm3hP}&HW}p#w&Eyi zl*Um$bP$%RJp*v+1kdbKy!qDa=pUbaibmKlJxiF1>42vRO=N_L<{;AiW=kdma2~d~ z3Q!aH6k;lHO$U}vdwPVN(YSzn?!JRItX)T+`P(njhkxZ4Xw91Cbg79iuKUR7tSWTm z4&8F&`kAZ60nE9$xx0;8%GX_=R5}-c6=wU%W|Mb(xsi(Ua(#~}5+y&uq6VeU4pko$H$RNd( zgDp4k6#@Jx&m33{9H1b<0&P-$vy>t~F~9dU{6P#+u7P3dh4HUm(M>Ct_tA+n!}R4x zpQQ7XQ#8e&nVil75S>CJ9|j%;zauX-Fh-spnpEt_R4zl$zw`>d{K{*zYQ;)=H>a(4 z-EoT`@}_4O5}ApG2P?x`jA}Me7D?>ME_@(aKuRMmeJ?`J#d?cg#5Ewi2BFjR^od;J z6To3XAnILI86$S8UYqgjEFf+Uq69;P|98LqA^P3_{#T}Ps{|Z`9tfbqxE<1a+y^#4 zCC%r*v24q54C!o6ZUcv6Hy%+I3cQ$K@7m?d=wH3}UG(uk`D?z8Z=ySIyP=KxJ*iT) zR3?BXd7&eJ?w@OPZ!B7Hb^^Kt$owc{#2Bh-)3;1^F?yoSX)JkaI7{%lR#J*T6Ko-n z6Nf{XXNNFzo*e^Q|I7##@><>*hN%}>VjODw`Y9SqQSGi0&ptMk1QBX{AZ+u_c9K0) z=Ld#q77%7Q0gk0qEEj0&h84n%|K-P?qTL6Ma_U~CQde0XU-Q+s1grvzD$yJi7Tk=a zsC7ebf^rIIzLu}$u#X%&N`L+rXXw=Fv-F;K-A`Rz9m3y_mk|0f%-Hq-l<&nf*2d6N z!at~^rtjJ4??pQWqWT;4T0&vdm20YZv7+mVQUr8mlwegh{SK2EQGycOI46}HQ#!2X za&1>F8>CHMg$}u%X|qHG1tw_>=Jg$C z@_F6s;Gb<+wVZzCXMc)5`ROmx?YG`UKl{P=Ez$Fe-*b1H(SDB%V0ONumJjwldNnx! z4vzlh{6dAgO64EHd+0Y42s0eoC8L20t5kIH8OxHnzY_W{uXhclde`X`oa?@@!FAy5 za~ut4shf=po?f`^*k~4HlnFpl$~5T$ktNqq)gWFGj^5-Hr|^McDNcz%g&y|nWgr#W zn%*i3sb~t|nP#FN`qbN3$Xv_Jr5%va&)4y^#_0*bK50)H)JHBERyONb*Iz+>&$ zvVq?JuKVaypZOxajWf8fUri2xuUTsr4YZ|z9zVPX zsOQ!|oW1h&KT)}}le&9)+iv6Buct0?&%j&k41C>a%gs)Z*V#|0{%bT;)NFSNX54VS zY5&r)_9_PM83?Q9o$#Dp{#M+r4$R7~G6EeT97iBhWWF_gTiaTuUVcskgJoK~YJk4^ zPtQrcKRQ0iscS}>S(@}RZzRI&vXp}nSIa<7h0&&!)?g}d;fu0yAkbUg^+uyD#m|zx zN3}wGcJHCz|JZ-0-}&u-NBzB>Tn^1@pi%@w*7g^gy?EGi%8oAa??xcs=h+dZ+W79H zjXqNb;C9V=ON3DDo`{BI$Id_ArnEQ;)z$!12}pFz)?^>cP^}qS_7DEV1EOK@mB*jd zd;A~*(JO&^Nhqb8mx%nnfSb4!sQIFJ90Utu_$@;TcKfxP>DC?Bi1B~$r{70AZrBz_ z{M|4S#WxDZb3XKob^~YWzzpIB%-+8Z$-Fy+57)v~Fz;JyPF$zWt zJS{U$!#ZlbEv6DGz#4R98h*Z2F$CF3+5#I4CP2_CZ2VocdSyR->Cva?)qMx4*jdt| zsUWb->v~+|sf`3U7IcJH4vIG%*&z_xO6xouB|tjep^X7@cCy|wX0hPdX!MQdK zCtsW?m?mH7kdgS>_I>MoY$@Qy*o_Fm=zy?d>FxL(3S`V0(t96xD=i!1Yx>P^VP9R> z^ex>F!1c(Ov0tE_+`l7V zMao;;?^oW%iWP};%cl2Ib~>bqbz5kjYs5T1Z=okc7L)a(g_O8QrZ@3y?h%IML@6Bx z%mQK5Mc3=Uz9G0UJq16A+84@n`}+pUv~E=&J^aMewEx6OSu~M-1G6O6GOWMudU-<> zlZB7n@C1?wS->&0TF|l6E4xsqO_}lu&P0Gi7)62LlAq7?)D(U4GoPp5`i*}p5qg$u z^R&sxJe!^P+9{w!A%jSi$%U_1j&aS^s}!L$JwMW0 zT_TH9OEd?Qzl%nVSdk9&_8#y7D+l}Nzx?HAsRqGU&ICYig6Av*q5Ly6H!%Uq8=%lY zcPFh~K0x>0bu*nmHzNIm-~9DoHd}A9^I^o6sdGx!dJ7X|cxi zr>LjDOdHk=(&xVM1RXqnS`4^asThSKk`!JWbyJK`L@8n54L_>=TN&9?HS*z_paNL} zUJn{vTDb-s`5J1AgFMe=K(@0-oW;(auhQ2a`8K`lq5Em>*aba~1d$$?WN6HFwmc^g$8w(ige?aHFVvUO|mv# zV8egQ-M0y_N-eT*dfn8mGzx{)=Gjo;GT<2U5 zu*zjS00TtXaogP-)hd$4zWn0zvB(HuscE<9^Gq$R;;wtzGwYzCAp`Q;W(@)!C!bT& zGxxreCP!~zpHdb;4Ga$JtY`uP&rJ~!$gtD6wVoG`^`c>*GKbuF473PzC^DbIBWH!gVfbomg`+Cb%@@8MR$cR&6VdO{VcbocM;G} zqDe+4PLHYH?ylWj|2M9>41hnTrsoze%-8DI=X2T1E&<4-orPkFqgtIhN~N|IfUgPo zd@nH=P|}M_$zij;8ApeFhmu%%u`^Jbj!R{VR9SZ&)FPxggEdgu1Vq^IQ)XpXMV4#9 zCUNl@Q--_emy~@T9LJFkTfuW~{14s+!9OSL* zLJy9Peh}6ERq0^cuD|fw%cP(o0G(R1Dh@&fGr@J3*7$wgA8O#NXxy<87Bdt8Hp~v? zvw!y``oI2{E7XbP9B7fpJZCbxF%G%^ib(PEtwb6P= zWF}69sV;8tOAV(mA|Dx> zmG7dI0dtTceIOa{q&4%4T}+8E>S^8Sl}}$f_VSq)o@?E3sx=AN!jYK@_4Rbh!JeF) zl5v^cOSj895!0+e$Jt1fAguJ_eRip7o$-%~Ai_F&u3tUKk#>^4`uLNQc}P>Ot~Kek z1E`sfe!xau*ZPFmlc?9CbYBykC?lq#I}~sh7H8ZN4Lgm0w;Fj(qc4DYx2$2~x}`G$ zDgs#O@X=G$&sl(FV+t*Qf>~3J_zx_lMbF0QPU~?IV;S#lMev1Sk?42^}<|RpUWZ5?`^x4DcFQi?GUp`)G=?l8UoF z)%G4H_z2wYL#!O!-U7ql&T__qmHA92{rRia0iaAiK0Y}uaMQ~K0!9Rk8#iCisrfL? zPPOex3?HR{4{x@kgZvzSW^}{QGqkG`as4=)pz(!GG;E6bX|u>7`|Emn#Y4wD>jN-O zGhF{c9vp`S;2VtC>`HKGboH!=1P*SfVu)`@Ze&x@KEJZN#L+>H$0dU4FXiaT=U>th zUK)BzD7J;)-t(kmuQ3t2`!AvtDv+k1M_LA}Wwz%+(+fc4Zy0e)gtwO2Ysi?DRzbRD zv=b1a&umVzpDag1y=|%J+u!*f_4k$|T65Qs@CLU+GsZMgKL}&yU2F9AI@#+JMz@KV zv7+0C)`(Sh6!%&wb_I|?9fqg5LG<4+{ zx=OYKlu8QVCjUl{mPf~DRA;#~`lcNlj$W+}pxJ0N_m53ZH#;Hxkn%4h0f?7SI=lM# z&}3-u?$;8xxuyB{lz!!FR6o3z)6qGp+x%?SkW%=soIZeFFmlNNT*1?r)+)47UpWUgw8zFW?WQ>m9HJ+_ z_X9e3^tjv*O+VQ_WFtp9kEbrpJM2R!JL4A}d3k=8##`XODNk+(nracc2zC7rSZvF% zD$DM=0nZdViiXS1r*dbP=Eeiq1!_6`_%FP;lV;~C)YHWdv1yFb{LeBBVSm1_7Eyln$^n|>l>hrbcu}6K9eD;uQp?WuVerkS1}7o9H=AkW7@EXud|CMue_Sks}7G5C#rhDj2$K4#Q08eQ}5@2pE zrV@uErjxR7+H5_LLxmMl96&@*Q7e{o)>#L3i75<2uRd1}m$q`7f+`XWfzg%AWm?Cz z|7ZWsX>!Mquwi0 z*z5o-?!CZe6EYkMc@qJYrF_~## zUbAPk4njZbuj;;@66^q)u%R9C8HcE~3v_26e+t9z>MTgp_3+7aGM+m>JVGbWoY4~t zer?n2kbG0lwb(J%=jJGz&d>u7+|SSNA?okzVMm}j7ZWacNpP4KZEnVkM2j1Y3DOap z%^6^iQnZ9>QQYiQiym6*5S+a*uKIg=&S$cj|8X^E0Qi`x*6RC)N2hP-=EDtm>E(3- zh>jh7jU!eEz4@N|>7Sl>EV`P_>Lz;Z>^AzDjZe}$-~9uc9}j8&iFrClhd4DX(}CF= z_@-$M-HC)WC{_fPG$CW9d}Hs;|DWS`c%BdX#trMJvQVLFttu!mL?or`xXOzffcnk$ z;zQw6L|iEnRb(5676han!|LU|bl~VodTrkUnc-u+2lN??zFE&oI^P5_Mv#@~+z^hs zjPx%M?P17zomr3dWSPirt4ZIWA=v;NfXH;oT64=_+Y6Gw;QMm1BvTJKfnvFny1KLM zgcfAc2ZlE{H!mFjo$SO%77Saml@vm^OiB$cL?U2k?Bo0T8ii(!*k({(%26F6lI5hH z?h=<{9=&?-7(M^$K00?{gvQ1v#F3#asVyuBmtdjLA@?;uJ16&D=cJXowj5&)ER0&X^d zOl6qU|5CZ|%FQ>dtNu$GoBsxM0M&ZEv3q!If;!8^%QJp2?zq>h6BgKl1EYe{naiCufKSOBNS1;0La z`k#Gar|g(}2F<6}dA;aoFhCeGp0=+2ThhNkq(^;^s9xvHK(rDh+UuqtoB+^xcB#s$ z*I?}xwL6-Ai2Pc!z!$?$nW+H!0;R5Q_K#VaI)FUmz`>&&p^Lim2|`kd(VFMfyiVu4 zt>H%Qh>*XQILjIu=%QgZ_OCwq41MRB7wOE|bArPtmrK;y-6dHH1V{0_k^KOdf$X8g zzlUC9h~_2V?%44Y^zlFWbNb-VeMFo^v6zhzf_CB()#OeylbrhBZ5)PeOvF*W@Ad%_ zuP@mHh{~R}egJ|XXO^{GD*ZTJe24X_$pD&MPwqZHIuY);W}|=UI{|8uKj`Y}iI&6g zv8~XcBj?Z4%&Ad&ZYEDJpI%M-OE;6sbkeEW0V>u`(6;{Fbf~pMYrr`X9#l`kYmd>w zfhPq;7p<2XdGYz(K8^kB+o-#%OAK*_qfAFZ*T*upGo+cJ6&E!mqbjk~qhbM0<#e$n z3VO6^Sr4azBkTZPqHG~2kp-p69PYqgfbFM=@;i4>aW0LLYCWzjPRx}E5sf5hPUf@wa;D`}cDkLyb(D8is(!HA<<^X0G6+@5dAJUz6dJA>_qvp`yUFoJo&R`10_~RXPUE^v1Q0R=G0x3Jp0SYNWf2Cw&F30t1nRe|xK($6ynskV2 zF!Yu%&!**jt%R&(%TGu6l-~U}(NrtZ>W;Y;uE?4+ANL20yXFE&M~y*5d23+E0?LT= z_*phvY=oAUS`x>9$JL$DWimy*(wq z#ywocj?l`2j=Qw=e(KX^4hG3_%9I_R%>v9=%0^5{rTM%4 zM~-UQ^LisvC=y6-N;l1#2C^&TyP##Hs&pBUG2g>LEqR5l^IOJYfY3x_tdR9|6r`p{ zDF8!951?A9%I)CCdGj0gsD1g9w|U90HTrc*C}Tw;Oz-$*h+8 zUeWj@oLZ)S{P5vV8GH4dum5aE@J7r4q!Bn@t$qLG>0uh^>$$`MV)Bi`IV|QgD&?mm zp}^TWuBAq&xG+wWx9m3Zuep)v)G&pochS`3NvfWkr10c9`oU98s?Ak(^yh;z{luqb zu_H0EQL)pp9cu5$VOqU>fckp7>Ey}NQm=O8I~+|q7Y6DGQ@Ar}lk(fu;Lvo4mkoB& zo&$&I^x3mwSjYg7#>zqr8@dwhd0)2qJcGGM9UdADdPF}FXj zmd_4`jyl?ce!#IHV@J@Tv(X^spPrl+C(t)IAjUm6GcOTV_9fW)&CXV+n9D?4j;^Rm zn24nMGi9!?WDLHNtOv4hJNF;v=am(NC|(oFnsa9_$m`LWz@U^GX!gO`l{nJp_~*0y zZ)7T6-QBub%2^K_Sx&h7T0-{)ShL3&7M7YOCnxC7|Kc;0&!>$rtJA9>m5lNUbYBca zvKWSV>5CRc`9;`(C9(i~9p>{|Eas2@;?KPosJ4{(v`*lk?Fine4xr8l^MzCAMpS=q z>5^!|Ra?4+`Zu4;H9aT&nxB}aunGFAVahZnXowv`ramXg6QwvE&H+eMrRsE(W{*u# zGgD-zaF!bL!v<2T3~O-wHitqE;nU4q({yX^lg}a8{~e+*jK80qfIy@T z76Vxj&GBo+V$`nP zd+EF1dx5W2#>p<-rk;z_XiNJ|=90Kg+wEMVPd5D=_n|cP*NHR3IFx_u7`*Q|0q=)o z1XrvBfMY*9JzF^gFi^Qvc-7r4NnWB8{93S2VzH)qU=4XgXT@+4_YvN3!iD%JXWH9Q8uA2wa^l$!mqUAq6 zMiXaG)3TvKX_|rZxm3=Zse)6~8{!JjnI?IOXyM=hI0|A!i4^t1=%|eEB=u*bLalB| zC#6}I@*+vCv_a(|+G`lE#`0@YQi^`=nbDtc^#jF-`(&erk-+E?`O#2onvI?giTs_M z?k|XO^$!k8RGpujlgAb(U|uIW^D5RsGY->EK#U9;nKB^J0OOK}jlZv_NZ)yOr)U+- zOwZELP(StcbxX7#9O#qCKQTTjrANI{r@^5C>fw4H*8?L-lqP*_{8CG^F?AF*mH`d~ z&#Qw=1kK%$l}4wR)7yJklKRwVKc{;L8Gq>--vlVu9Qa8O1IhL%!p&v zAjcp=kNVjV&RrO#(a|wE+*V;o_~=ENDy!kYW*ZXOfi(IIK0siya2Wh^8S!QG=+84W z*0vc~;3#NCG+-R4{~H_~VH{;+^l&`L0`Lsr-By~ zOOdhy%?R-b!+@nJzwOFu7;n0Hi51m&G>Gy7i&1AUT%eiCyrl1zkRw!~=>zyuZb)+v zBR6v!bihNilA93$i)OUTulEC5QU>_a7}KJb_+8ybel`-32*Vhyt5XaJsWvFDkXFOF zApJ+lfJp%Ef0_+2LbtI&S(vg?UW}xpIAlhrRB6Wm&A_37PC7R_PJ0g@lV}Z{zy)?T zCr_SbCpa!n1sQmjV4q|!FjyErpv=ewfW(~Rzr*8q_w>knh>`#q0D2dAy(pOq zoFxQCP^4HcQ7T`E7>mCC&BtY=o3U9ys2uEui~DyRLVKS;E#4U*YQqz_y#ez*b}8l; zD$UuM@vkqD{`;3;{FhV`ypbJ1z;E8GXNSi}ArJ|e?L~nDC;{|(oz$YmQn#eA*|9Ni z(J)r(iv~?i9HWup-2h)epug-O=7e~&$v>NIjPiZ4vkf_FwuUL)nB_3mPhKjsXh9nn z?!N6r|LQ)j)t)69dy#)u4d}wL=V{HF)nZr&4;|s!y(IH!P4;1EuBlz3ngsl#Tw)UA z$guc>2s%18p^>zP$~&FbDZX9T#qH(iva~~{(WgZ>6DfX8X9^kV5tuB1BWqK71SDfJ z)Fis|-y#3TgagLh+t(-2t-^;BhStlO8H{I!>vK4fuAWX!iw>AE{|CWT^g}RLcVTkz z;+DZgwDfcY*BHEl5KsByH@;2Bj-8a(2Pc3||LWDtg?Sm#et>I#a0!lc34jqK934so zOab7SATgfj=Ta`|-F(~zjZ2gT$ZGJjVo4i6UMpUwY$ozG&GGlh0+2a8{oGEzK4}N^ zy}dojkjR1nn4Cm?m_hoShrKLdkz#Wo&0Ds*qY01fRZ!2FK|J<>|f)(-KnUq0df|-EE!i{N5-9plc=E*2dRO zl{7@pO~-so7Z;+sR?h$Q ziN_x)G*$hjrgmT}6tG?@a8@t@-CsF8nLiz$oO|7lEyFOou-e*iExiWMY`11ZV%@S7 z!{w5dOW&nSzA%lW_<8$JVjiq48df0zMkxVi7Gb~MIDBN$dM~Zm0(Ah~c^AL|Jj@;V z5}S$`y}oI|aZe5o95@JDw`@YlItP<83((UYVR>$V#x>QJXdE%BQq8M+fRU#*4*WzPAFTpRbqZ#bHX zUfUc84Lzm0SwL--O2f|@7A3sY9Y96XjVC8(m(tfoB`oVO25wdjDTI z$mHbs80dKMvkWyjNUQFq$wfNXzoMNEeSY- z>w66?(`r})Rt-^JH1_VU5PbK(haeVD*h@G~Ta&=vUhHKw;BmI>(if#gbW90lwWDL= z_9%UyFG3=oWaPOVkaN#p`@zQ8Cz^P+Ps7Wmjt zPR+uub9XwaOda4@?j7Eii`ENJlbyF3*~ATlKJLlC>hD(Yz0NJfOfZTM{`+_SZK=u7 zh3npJ{MI_OV7D?FG{VqoDfT7&MM9xy@DuS=_OYdC3I=*Q)+9I8E`TjFZI8B2oE(Lj znNzTL|32BWXK}%yq!GlY%39eX!ZG*fZQ&0S;jXD*Y7p80Qtu8>wq6VBA5O5X` zB@=O&nwo;afqve)OJlL^#G-S_iZpY>g$oO~XUb{UKrEGnaz2ZBeW7O1T=#Ig0d`B! zX7>?$ty1RPqGq!CTVa6q?@Y3g)!BmS5B(($w2Kv|`CNS+H zr_tTr#RbtEJ{KVnax5lmCYJeFP|8D}k?J3TK#1F&bX*k04z8(W23+7CnzTJ@b>f=_o!5fzwI2p+_ziHlsKT*%i-j#rkHP|@U3wZO4n7AvcWi+S=FUgQPC;L9#L@Y0 zW&FZL5~-s!OW1@EKM8Z7Q6-k=sQ_o$ReXDLkDift)N6K%VpDoGr(o!@`SlLppNz8N zF!OxD09V5ajuZT+F(op3qR&Rq$jLZph=+50jGifs%$8F*Z|i7-)sq$hIE=reIU9YP8UJeGvpOHaa}IvUp#hFf&9E_(gCWITit2P8>Gij5 z-NfGy4fUas`uWtwVo9Fmg)mhiW2fUu#!utfZHOdvX9)=t zgSfSs=hT24Ty;*sM`;csLORydGjsM55JhTY1X>N%`#LApYSjO0C>%Do2kQLm)0rK<%7Jb+!=2c2hUm zV3(H{As$_1MPD=ui${QY;K!`3r>eI5xR6z@l74JQLC;B1t=chR{X)#^DXpOUFd99< zeKL$-D2y;1b9#)trsD*t+D}GL21>=l?w)Q)AoS0q)9i4l20(>GKdsCnP6eWk&6|fI zmoL>qrf|~L`T}Qq9|}8wBPVBB7=%bgG}J@JNzt5)nxeNowoL3wGWb=PM|406NW{0; zx@9BR1+tFeQ(Ds3-^*P9D(+=7IZj_9tl3}Y`cNBwKAMOmB_-P7M}#PHfGjJIjzFX1 z>Q(u9dH%vB?_Fp9HAQ~+d9~K^{_Bz7O^LRzMY@J3XO{6|(;vS5wyzyr$6(!t4eJno z)*BdVi2}|B1VCTeR5tg+W2fepX(*U^3Tt6CR&K}%6bm_6U79B&6?E~^+oSwn zIMwkoYyTT|yU*zeczKPN4fn|zc%9-PIY^4;ymXV`y+6RkJgNCsty~{}`W|hhe<1+&Ng;fxJ`%^r*ht0WY}_faDF@;+l1_ADfP%sv25@+1Q+| zI)XaGkZwXNL#1yc>{Uk~MQy~Haf~AP^Oye-6qEpXh=VVgpphnVE)FM-9%O+Dnq42q z2-n-w-qh!J@_tb-4GLFI$ohU5l?m0Hf5AmuXiG*H1m^XOT*$a>ZGT(k$8gqvb6r4^ z8i_t6?@g0)=!ER)K#gH9wZSxAC}J`5kD@;f`%o=`42+6wR9K_qOK2t#3UCpSU^=xV zLrk>MS$j~T;Uh<9@DlysdfTtL?AS%NZ1F9(KsaYMUL2nVhGmL=ONTV z@0&jGb?WtRZvjr~oC{jgH~5(Y>&FWFxn-4v!w;HC~b|)##-5M3AE#BdnV6 zr+bqOT^s?tkZID5E24OxTwPQ#qFc=FbJ~FP9;>{5Cg2c^W#?d1g2^dVG@Az>K*J)Z zK^GuZz{x3;3bY_p;i4an#}bW}q8~wL`b8SLq35I48ddixJxIk9ObTM2J^oD}MrJaU zAf^H@zxrj6NapQBDmkmXo%Ww=%OOwv5#2kJw}*E+5iwB_k5zvBUhW3a-(=D`9xaZp zCSYkX%I}RyLj6662s-(55?Y`ML`oazc}N8~%Uyv2w+ZQerc)_)2$a^410|F|$A?mm zst#g^3yUTf1*z?rp&185Z)j<{chA;x`39npO?q;(11)y}&{aF2Z9n;ZK5=w(|Ltc` z^*>!ze?3RB?rgwW;{Xr^7ziy7FGUj%t;EtW*xz0ISt?(sGJ;@XaRyR}1&mNh9!#l0 zXm8Mws;Ji4?RtRhw5JutQx?@0DFg$wdqRrOz}ue>G+E6VW)`Uh$S z&qQ=V%4aj0UFh?&FsSLY0eRC#h*Tj=>S1=Y8^(}?E+nvWVtY+27DeoC%uqD$FX5UH*6Uh zLW3;UN`1n0^jR95(1TxP^_>%wGtBoVLR)zbyhR19?JBZwML%`BOPeEOa*{>%RwJxvZT{u9n& zy;R|>LICuYNM&;O96vQvBosii_B!U-6(3aP;V5DCTl?7GNMk9e)|q z1hhA!M#rHRBI75tcv)2|l5i^4&IUQwb`vJwgs?9FLDJYH7()DcN&(6R5FQECE8hUB zFM!cW0cq>?kns1z-aUI^>(=eNt@bNwM*@KEbTR;W3E3dc|Bc_E0XKyH~LjKx_lcS4A z`9IYQXuTG-JH5PbP~{p17569wpy*D7qHey~$dCSZa%u)0LyGGJ^mA$n_FxK7ES6z* zc9GMiAi{VW9j08LKPO%Rz4$#90x9Pw2T8{(>!dglo+GI6@uK<&IT)`~H_=%#P4I3; zcedD|^VCsmbI72KqL@j;$jwJGX!a*9+HNbvZ`x0xR&kww>CWm=sZC%~4k*oh{(! z)7e=OnxVX%igJ{LS0%+LGSAE|aItTCW)WX!iFE;JFzDQKwn89aSMaGrK)VvC2-x1y z#>aVeHO^zd)#oGyBSHmKyC9+vp#n1OAP)&uxHdqe!ooS0Hn&1@*oTev8zIEncAkq7 zX1US=(eVHF^_j8p$s#RZ|zL22aIUr;p+q?V{D~pht93%N%)*3i9evC;nlm?udm}IEhh42|%kiS|O zYg{f-UnrBw6yUt`&u=&g#e5E8%kxsHRI~`*k`o}sULso z#TPK7PG*ZPx^I=D?HIo#xXMm515{lfKQ)EvMS`E7(u|p@IUe?*C_OVh&xTKgAF79J z-?j-xMh2my-B$fcr82Ovu)>@KdJSql5?z^U5eak%bWL=2w)5)}qmq7yx*Np*rT z@44fF7eV+DFHjtW(=q>=X((r%13(l|&g2RYot$2Lo>_0Ez57lg?)e7v{M|zs6)uCz zFTDy9c*3h+m-J49fA)u9?73GFr=FLgkVMm^fe)!x4{*r36s8af$T~D^g>@W)Wjh3k zCh8CkC}5)np(6rNyfEK&F&t91fR$QBzfk6)(<2W*1iNaTZ~98E;W%Fvu=`67QW1-90r(Dn68!kjytl`mPQ3<+q)Y2j${is6&SpKuAm+dip(PD5Aq5Z2k)E82j)x~Y)QaD}=$9oTi% z2weXvfb)l!U@-l(r*G;msn;Ck&At{WwMxHmqOg!u4Rd0xVJn5p8JG@BkY&LbA?Tox zaA^N7fD3N|;fsJ&NHctW;J*K0Q3@)KJ@oL;AQJTQ&N^s@{I0yw#gvC^zRVH+`Ws%= zNPxnqmBdsapUs-pb{`p}4bA-w*U9Lq@=xqOV)oHKKXL*cU0tl_PsAWH1d`68{x`AW z=y@3a;{{Kv&gsHufl&NCiui;MNFkYuWan?+%97=?v-9w}*IbW=+U8XM8x6ij{&Dhu zejlpLH2|tDP}QGTm^tNj9^%3CmqS!Q+d*JAa6A;Dcq7;LoG^I-`%PWjN+{`}O z4?#|1c&LvJ-|H+xp<-axkt6SMxB&E+W(lYZK;Kh6fPOcIuR&=IQH$yL&~x+W4B31G z)(ybaf}A_as*vNO0_CQSLtIC(8mvk*PJmg>O3%&zUta>Vv>LaPnPlvlCx3R^e?fKs zbX9)~*1XHcn*wL=*J3=CyCs@Sz5<-Qd}eMIdN3Dk3u6?D*R=!GU&&_ zpnF8XeDE?c9UJg;Lrfb|#*BIM92Np;+y%#$Z^$00Y^9@KJs$%j6Qk0+oel&rw~Tay z6z&9B4S-1!-KNuGq(3d^YwzJ_4?n;LOcC;DKYs#VeZ$od35OU8Hn?da8dlIr4qbF^ zApx&_&8uPC_8o9y>{xvc!r+1+1jFsT3XO(asHjKKn2K4H=aZaPFw(}ncS?B*82JO? z2-gFO_(BxbX~v$a?$lqW_8rFz@13jYBbVKdJ%*q@B(!<2%MiV!(O%I(Rx>DOtiZx~@ay{5@aNfd4m7Vz^? zH-J7DEn;CcWc+=C_Hj%p3MG3+f=ELYZ3#8dJ*5%U?xZw<$DVobfz12?YLODtv3l%? zaa!FDMX7{gSoO(2Q7;BI5Q1EWUvmVakupSGn3I#U#_IC?-CzFVXO6jou-PKAS1$px z8M?2R(?ip|e+x&@@O9QY07L^6v@C|Da-g@)f;j{m6tl?Ociv?Jjn-HP4cC)>+OQIGQL4QIegaTyM z%RP2~AcWArlXd;l$qb8ac2oz4ovZu>qO4kj`*A)9vh%AR!NO7#!uh+L`uDD1Z?V zeojJ5)FmK|Luwh)F(C95LZ{P%&Vc@wkij-QXZEOw<>LHX^?Cm)m!k#xcF+G)5%a|4 zY}wE&C;sL0fA^y^fc6qJH4&PAXT3Rp@j{XRtWE)Hm2j>6y6U!7ud48cS#1F(5O&wu zX5HW?jT}jXg_I0)Qy2+>)NzX7t>p2f_o{k6<=GNgkge((USbFmoIdgp6leA!1k}*+ z%Vj*1MzxYlMsAooUi6qpt{w;Z==~7c`#l(5nXpHST}ncjQg^HXsOW;N4)Qhi6^995spdusi>UMJAiz#coBaH)6^7MvCcbp7hWLU_D0o}#ri2y z=;Ag()4iYrMgq)r4f6J<<^U!qLBo99cw7dVg6qc zl2UOWOM;*m$sX8*#tY@yr+DiCRqd&_PJMlr^6u>9_el_!43FA- z6ou2tq|JasBcVD#EE?xlrQpBmV1=RR(hAoKs1880_2+Hh%8_&hkK1ql#yjx&JP=Fd zZPJh2Z2V5tuciYoc`V}QGarEpbP?*yN7y)N24Mr{^JIMF?5HDP%e~`!S&i{{E*1T# z3qWJS6!EEJkVPj#ML(Ws#Lq)g;^ZjEu~D0l3WMYfsL+?g)GOkk8*+Md>%rHf!lxhK zS64?HBY^E&w=g2m^*XP=F5fO%;PLuuH1`NF=`D;+Oc^tiW8eMv+iy8^8UsI_p5K`i z1e;~SEZ6<776QoRa+_@qfK?JgiC=T&HE_fAuY$`iy%wU&3$A9T4-8sfX(IgJZ~=(H zEdYzlU`EIBLRf}M458k96vhr|pcji690b~{MSo8BopTsnvo2%jO z{quF>uTIfP%uXai%jnnw{LRNd#tOa7U$h-~apol6CYjRPhS8FjfFRVSjsWGjbb;p_ zF->ZT5fye}Zjqxdwc>jFdLe<4kr{xx#*QKs4seg2Y6U~+0D|aPMvokY_x$?XF)D9^ z<&})>x@4E)uV`ibq5&0vLw+KqVjfv`J};pFD$o&OiCBGeb4%RUrx9SP4^Rp~Z9gi` zu^=f?hM7-a;C#IUjh7b7(iR~ye!nvmM2;`IvdWH-K0D?AHW5hTE(oO}R0JL9?ZmVq zfes}HyUyLgOHoYI6$YG1#%2{@cN*umNIK@@lk=vbm5+boV}E>qbY-amt;c#>bpoU_ z==ry*1-zi~pOriS_gA`5=wNXS(=1D>{Pc4Nj?Qlx8Gxn5Q#=`0&C`vtjK+`9)=Ge^ zr=hKw14S!_rB9@HLUa1!W3uOEU_P`?#{1BsV0)~f&Vc))k+-4&}lO^i( zU?J6wpR7oN`g{Q8wJY%)eC3vJv^*wM512VIDpnTeOsf1-yN@C#UD#9vWHlUGqm8dC z@!G6THu7b3h-`%DX}Xy%TVirf37?O0WnaJx8__xR;`8m>djM{@?pnC&WtU;(FXD6S zb>nXV`Q06W`uCI*>(JF6<_}9tPRKZ8G~I{!KSg9R-rk-rMgVl%x@FiQdGTZzi>{{A zHr=}mqdSR$@O6Puo{XPfhB^ZzRYon&<)x@S)=ctZhztnD5D$RTA4)@r0ZE;Zb1~{4 zId*~_=Oq`NkLjP_B4Kr!u{jN}+#P@xRk$U5orUG4WbmT3!Dmnte#8CH~2amFsG%bBPT$S zKa9pjWFc}!Mb;ez=E7TyTJl^6=e%>XWnpgOuDkBM_0(w!dg2!#0f{Dm(`@j@X%N8KT>~hT z%kLwZX#4;M2Ji~Ps=rFbreFKyQ%@{Tjh}FV92%*mm0$~u20|NpKna8pFVplGNlBML zv1lJ)jtM^|=GjCIl6GxfF>Kis#tLGB?h!9w!zC68!S4i>OPP+;H7=O32T;# zI~UO2=bqp^w70Jh9(`;#q!98B40O4KGN86Htm-(b>%i!H8i3k+a2h`O$xp&N-~FDJ z$A{E|j_rF&PAB3fL3@hwRMDm=M^*85CmkTDOe z|2~ZT`{5nG_GWnVO|OB)l`I;S(P;dxDu2!BVXg63(GBSZ3?kg-A|S$dGFD2BDDo2z zAd2}sO(;?^j|!U9Hl0rNG`S*0UU#%Jd8sd#KVAJmNmP0{5on)_NX+woV zMp>9XY4T7EspimHIy4v>+m+-16JX3FA_Dy&K1anC-C%TphG4}&lrvxz@c+GGjy`K& z*IsFP$qpTQx-}@R;O}P209#DZ`c+UR6(T+wa&fi3FzSqK-hz2%ca8HuI=T-wZ`sQ5 z`o8-ghHV>rNDJPcov#*=C3mhYxtxK*5^E=kOPcqcDubf!T>-9piUH{pP&i?G#8au&1k?#YD+DjKos!{bHdGz3d+nE~uQqS4#~@OioLkfq$=Kpozxcnt9*@Vh zb&Ov+16uET8~|&boZlV&n;pQf1`hzC>_9t7IG43D6}S+d3lq;sCYdBj7m0F3TZ~ev zExaVYNTh`MVQh(8Q7Zn-!$+sc6>giarGZS(7w(|;fvpK(HMZz3-h#L70!pKJA^0)P z=&&HRT!FEf6^x=mj3zSVQuXshlV*YTF1`(H+J?rd!NSr4Y)U0yDxEiygv(^oTpwY-i9aV25bXz`;vo@+e9ojHQIFG(jv>*3DXohx zt;AOsXZF78>dQJukBrI0)+AyRG0BMuD4HWcgM2%z>G#`te+;H(XOerKee|0L4?Le} zDi4Tt$^~#5dhdEh`ix;|pPK+j3AyUYp z!JE8;&kLUZUEuBS2X6!&NGuLej@95hF9by=a{k2tp&5Y0DCXv9=;4b1#*YI`FOXDs z2}ZhTgw}%D1-lU0frc|Mvb{#j!M2?c$BSihathx1##cciU4#-zZdcE~ zRE?+#cLQn&LD=$CI&bBzz#DIR6)O_Y&P=m0xW97gBpUdt6pnOgo!uLVC?u%GWwETd z!aRR6h+?4tWi*!FwlIuf1k9yV@XBki#C-qNXjER9TTD3y;g0fajbCbr_^pkTC1me*3q6^Obl1@F(ilEnDE7Z@URd zV!X$zAylI-JHNw-d`k+PL-YU%)AtTC{7v(Yc7w)?8EJ?~l_Y9iG58%fmxK z>PRnmLiSeOz%{Rf-0nrNDtXogpt*di2juo(fFwxhHA(&l%DYLT+GJEAllbRB15U|$ z?ftg3cQFN(Ci1-g5Juz*R7h&7T!d3|)39-5GaNa55PtH=6Y%n@uY~9KWo>PuYA=wh z66_0HwFH|`Lp1}MsXsYs!G}Nm5qRf2-vQtJ#y8>NpFW6AWrDjQF>$7N@WAi*|HIyJ9q^A2+eH@w8bh!9!0e`5n(Dol;);o}(r>BeWsXe%`5M^iLXX$o{x&%gaVdl`mXCL1^H!-&O zhu^yW_xJ4|^-Rys!C$`PW;|{ZrWeL(jK8%#Q)lDA(c^kNI{%}8{@gs&l)E2da-3o&y``sjU=Shf06H!SofhW0`5dfjHc2R5 z&O=wA4SM_f;okcmgv&3v5QaAP!2Fz}4JjzT()wz-VZ651E0FAalHcBQa2f{tBJfuq z`xyMr@B9wz*}D(!zwcf+jLwBvbBi+*@bi1`P|BsEvFoDC<*tr)7RZR8k@S<{qoG}L z!8tr$ODe(BvvC$BrOiH~$&jm+emG;}Z%z;Fza`b6?VE?}t^+x6G<3?@s|8o8Q84}3 z5gQGlvm&R^+0n-BJ>n|R%>GJrl{W)XO{KTbuC-8sFqyK&L#gOTKcnfwm4*4#^!Tye z&p!I#{zQB=|A7yF=(0;LzHrk&{Nq>T%PzSDcJADYXvCQto)tLEYbol8Om9YH0VM28TAQYy+S zvTl^X_vIBZym+s+!z%5W_uC6cNP4W)X+iIx1!|iKGjk?%Xtsvn<-!CXItmS;Y)6OP zIq2x_wbgyf_8yWpOfL$RA}_!6B3zxEo`!RFo&%!?_rYEF+|SfnnyM?8_4SS4RZy#5 zoJ6l(!W=!9(-`8u;ifmiTi)_!SXf+!nQ5Au%U~2lqcMcMjOoq!7hen;hkIF0Z2Q)Y ztc(+j=OL3T!^F&zqu(bQjo$_N*SwFK@z--?w;Y&oSIix!Kn|7u|FT^>;3tniZOd>+ z!knH^3zSGbGz;LTg(Ud@)!hm-+gIEl!_KJ|LQ7jqM_5* zG7+cA#Mvcdd1YzgM|XecJ55BNYJToEY`1aCE<=@^--Q-@{^rQ9yKZhra7OU|taJb& zzyFqwwl-nn)gI7IBecc)K79B)n0F-#iKv$#9vQFX3tAmLyiea!7P91eH6kOM8BL}y^51U;7kqf%;c2=2#=_&0MH{Z&d0It}PHNLs*z;T{W? z=h5hkrP@{=f3Sll3wU;bnuE03Djf8(44DUW`$ddW3yTY|Y4cXzMoa9o3okey4jrAr zzfl@gf~yf!5-#PST1sG#F=P=9{AAfTdLP1OlQ9vq5@MVN*8H*B5Wi_KzTl0IIIa6=mevy6U^bQJnl*2 zk6I~*&L9CAIs-xtdOihOF<0XRxNlYGaFn8amkIsO_mZSQKULbfP=$FbS``spbk*LV zo0(tbvokX{4;P((KD4!W!1wOF8_q|A7#i%xC>M7bljO*2xikb^9fIZ&Tskf!&XG(N z9o{|V?GpFKsdk`xWfuIbs}t8N_Ral$`k~@7+(v^x6X?Iz_^ZE5Ma;p$F1T>VHaK|v z1Xt{-otKKIm;sm}2aPCYz~SoC79vdbcpm`e{UqB>MNM#a4{jVDV3{*Y3()XWD~t2f zk3RUrCzj@C)1_jex^PqayTAYJn}&xsZTi|bzN5VBZEuAg+qOcn;9B6(v;?rZ(qH|G zCX&{X6XW@x{OEgMLgQa?8Mpi%fZ%iLzQX_ygHA89UVF~L)7zm-jdE#-2Z*}{!mZqtY2M?6d z_z@4%s$INzD(D0>j&FKJXXRSU*(z*W&VnF9298oN?-AtDUz-eKT0yYdf*^u2$Qch9 z-Vl`AhM-a^f{{;vUd%%!9pz2Kbn$AKV^9yVWYQ(HG|pwG zXQp6yWDAU)H~~L?@KLz>s+YmR(V4nt0CxkLbMUnTH_ef{YUFDihr6Heg8i_b@i*oB zYy13XX#Apa9eM^)KwobN-gLut@YvpcoThj^9`La^h+tw3$$L|TCv_ew3es`q6oE&b z^AL}v@Ojet_-Zu1|G6ihKYU=%(#qljZ`rL1d7|+vZ+rW@&-wE||MQ!^b=wc*O~b?R z!4Lc<{=LQY5nBpiY278s6L_#O=A;-^5SJ@mrf3`8mXLUe^ya(em( zFctU@*t%sCY~8#8CZ}Tdm~ex^ItJb30HBGB-@w9K<2YQfU2ak7f1zUE=~{lxd4F^2 zP%{%d;f^PYaLuLX!rbx_Ow2B@LNFEnz(G|c213V>`2Rk1<}_kUa%M}@vpOO;eQ9ob z;>5Ah$p`Pfd)z_~tg$v(V>Eu}yWVsDU;gD^yy32U9`w<3{Ol>_j4y?1J+ zDQo4TCF}Z>A}bI1efDX}r4oOqmy4>cG^1LP?K_QZRszMSK)0F#pINa=`8ekA0UZSJpk>I08g!XnWc!vKD)%rI4oC$q)12g0Ln)x@BJ#K0w4d&4?}-{8?*4L zBf}E7B6UM#70!a;wduhc=TJ3Vxjt-Eo#X?6by0@fkfn8vz0pxM=l#MBvz>b#?KP1s z!5go?8ou+xhal;UK-1z6(gdW%9^@oRNoZ+lmNW(Rh57kJGPX4R_|JYizBE6djjk*e z*XgaphyL(SuKd$K{qHwmEm15Xyzhm)-cB%G2dhG8Qnt^! z0&7u6B|&wz07qBjU?MumkOWtz zh{$3UUVHsT%xUL>;gM;3;Ur!oIx+rCqWMzVV8Ha;ENt1d8J6Z};G4I84?g@yAK-p` zGLd&ihNU$*`Px*VF_(8w71n-NZj9uO{r%HL|3<~%Ruz6BL_`04J>z#H0jkkSLWTFd z<+bqBr}jV;Q2=#t7L#eF23Keom|>Q3+4$1&(L*zs<1d{!el&&012Z_&Y?Xui{Q>1K zKlX|1-~P6nFaFv$?@%wl^b&a04X?oGl5M5mGlBfhdrqS9KfC`>d1m71BmejhfBlmd zQ68G|e}L9wyUm5WW<#&Ei2Cd0{P1EU|5@b#!r{ILzk$6Nmjgjc` z@(tNcrkkQIef4eW)%A4I1e)0k5U|)99zm|5{YMbKRy$Wtrk^j9oV%;*6aVAWuOAo~?)&~-KUUxQYd6El$S|H?iDkad)c7eaj3tuR{?TK`o@XBU z{@1_qkI%Je<++P|ay5&D))RY16TGh)f4RvKtXJ&&PaFSP;Q;P<fQgfM6f^@xPkiMCy~ z!sR@41QSA++Mr@!)RlF^G76TFiYmtHtW?P+@JO4^_8N%=M@cA?E-{MoJ}<)gP&>%& zy-)~s;F;FBpKn#rs8^Ql)Ir5}i}`(jt+?rA6o&+yqZQyNBoA-|)H{;l#-mrkt*c%vD$~i3X!wGo&MnHPKpb zc&?_Dp^3b+{=m=LJRe#Zei2(LuT(BIbOA6n&&hpoVPU=xqrk4}?{;)-)RT#f)jin5iyVrH7$nj;v21o& zO4Mt4D=Qr53f>&}NVHe=L0P5Ax1uP`95>2Kr_4&Js92IvWL_O65CO=LCUc}k5wuBH zRw3o3HeeKnmRBI(GYpCDUhtrS7p9IvCAq@UpJ4sD7hb~7U<3`H=&B?^mEg7863om- z`DZ4l^d|G#xmBQmvw?_J3AxQgKkMopgohsfIg4Yy?D9)tVmi)xcXgv|(S8$R4TaZj z{8a;&*KO}Lj_wk^!4=z-v5CQUVi0OR}XnT-r(GP46eTNN>&mo=BYCyJL}lbY;_L3 zvE^tCj*N}v_V0P}p|AYw-#^s?(wi+HzB@NJU52c+FnrB1eyzzdG#C1eb%zjs!7pK1 z);gbC{L+p8-Y1{@h`+7<^VB*Em}VSrpTY?FgBm*c?suNaq|=)zM^qHQ+1atF81i&M z_x5dIpphNie-z4Q8MLlJt5P(DC%FWE9ihLc1cAOV1P9Lrfsnp9a|DVf_kx~{3qA{$ zB`K1Ez9%T@n#8TZuvfsKq(T54z+zYdfvDp=BK-urVfvhlK@Wsr^~oP_=`hsS&&tQKl?C|7pZpQ* z*uE9UCsx)v09SRsp}#M;YQ+g>@#$JaU)T6s6$l$zeT~MyUbJs;Ah6c>>z5xDc4>)- z!iWGLTVrD_-4b` znp%FkE84%{Snsc#1Nh&R|+0JTMl$cp-sMc3_Y|ERb~G3_@Bh9+G|*r zxj~X*rX;1&S-lrO{zG_vmRDC+-Wd+t%N%>Udd)U}htV1779GJLL`zwVCjZ(y!mxRu zM=Z|7tz|ulMlFjtCfcg5TBaw0XGMYJ_+coe<}K>m6A#3&>_T!LaX{D?D(^fmuMci9 z)IK958;3lQ#8a6}l|YpnjgL6%pS`MaETROu00Lj)7m|I+cq5eT=@9Kqr`_}F7`yY5O zY~H*H=9W^Rm(7+kTp%}b1YQ)gud%}4%J^F$g8vHR7Y)gI{d*$oWHPMz!mU?A2ef6F zj69nuGx^b$Txg-QafZg9%w*uuu`xXnkIvq4`&aIJ_UXr#p>b-@I89N{XaVKj#$Rbd z0PaGc*~IC${woT7XPpE1k7u5F$dZ-*BEsJuNvz^o%}bIvkEAy7_WR@GC(^-SV2F&L zL@uugcWXXL7L}e(i{{I7si+7dOdlB8LUZocl9m<0kO^TRp-vKnz{uR)4nesBh0Ht{ zie%}MM;Mg~8j{A8QB^g>j$H-o(u*V`JfNE8q>vZK4Rs|Zq=J@*ZRZ#G;N`LkEG|vM z;;CabDXR;ve6_QASch!cf*it7Ln=WQ(MQl#68<9E?<8wz&y9lVBafuYx**D_lf`I#I4LNp2okB(I)#|}Pq z|BrvL@960MxQoDJH5K=or}CO}e0P+0-)k*ceXR`N`oCrPFIflh-A5n&d`XDcXqeBn zNm2r#bD}JSfgYcwxDC^^Mh_p}=3y0G%*)%_&2#;#>GLWuA?YHT%b-E$t!_*OdV6~z z7LN+WT!6MPSc)z|NG=PH9u~@mc1w~CtLQa^hj!1SaVadA=|#KI#W^Dy+;BBd5RgWo zr70CFsRZ|0DSeE-+|wF z$IWp4byvgUN*Z!B>q1bbsn{ns74`s5m*cOk@Ha&FCgX2qxN8)E)~f-ufcele1%L+r zK$Ck|zoLH{PQUw$q{2?kEa0)7$^87GyYIjAd*3_;t);cxL>#RJd8g78?VF>%-URpE zQNI;o=>IO#ekmFMw}1N6Kga@nSd>a4Bt$wO#I)w|-is%%3qAgJjIINZKlZqu%jMb> zdsNiADio>sB{UKb!uDhm@>YTN){Fj*5ClyPW>YIx*e@X94TuEhiUAC*KG9)CdO9GV zkBMS9hzG#{)i4A}V}Yexm+sKuq9Glu30+9-h%$DRVSWs(@u?zIB+0mFt5xa=3OS}( zYCL2}a|<(^uai++^s?)~Dkniv{boc~7$g`d+PM1cA2!qO5?%nc3a8wPy+yd%1KQ1+;1g!`?)_+xB|EzTYU%l_X*Ti)FUxaB&eo4x8Sk?){UBsvMQia zZJ@maDn%PfG6Rs9KeC;zS|&z&*(5hWJ_uxdQzTlfFiXhf8*L)8WLuDg96~G><8Hy= z;4tid_5f?!zy0PnLNMTk=xWvh0%tP2zdrPTF~x*%;OJy9~qdc!ekq8OC838*1%{lrY0uac0cj>f2a3MB%6)FpmFWa zj#5QW3y8|3O&Ml0-6OH6(-d|61fPrgO;@%t|*P>ID|mPUPg<6kf8pU(KnF=ujlICgTl zn$~2>6n>hKR}2VVTmetQ5b=2pjxKs3=r`b;HeFm$Mpu(m;ZzLZnNyY$3I+se)L}Hy zh6V;7E9El7y6zps%swKat1769Dho+;_*xK=J^2@3@n38F?nwU&8UN`F{0xjgS17P_*UZAaF*|W=|G$3z ze?FSeXG={+?>78aMZHRk{Jz|xxc8DZ{FjUaNEybHdDGm8P}S@!mG%k4NS9?9ZC<-x zlB63D?u+N1doFSG=+T=A_EYqK_x8Th6+25BhFFn_$|9XqFoH{BAmkNFd{K0+EJNBT zSYB1OR7n<7c!(3UfYYaf$5^&X^M>&FyFl?^^j8fLqz$xf0{r-tU49cfcNtbisKO@< zIGVz=p`?pV9Xh)^c#t*WM;z3lPtJG}qUJta*KTe2Kz>um47 z{AHKFS?cULH;9HV=d*L4_|)G{Z#(DwjXSn)>)JH1!Ao06WmypczfX#UeS#Q*iBygq z18L(iEf}!_J|<$Il}@KD>U^LBFefHvDzh^)dNjIN+`o5ECY!@goXr@Kj$Z#YH@+ z3KXAxE(zO%D)=iNOU_aYO_jF_9eS*?RYaQ&$dXk-2tA`K*0>}=DWC`?pwhZ)5r(4W zG1HhQBSg;ULj8~=JOzV)I$sWruuX=`G3UL+E+#N_zV(f|F~zkU?2CDSo# zvx$jUX=3YDqkqYD?fREpL>z8t}d=owHESJYR%4K3&J%P7_ zXaMKp?VLiP(EYc6`?qhvi!emSPw;;pulCQ4P5L@QL2Y9sWORGHVo>;`^F3ZTPcB<2 zUAA%*IDM+6mK4jx{5kDaL^j|7xrC`gNtW`yqEK>a&`pf8WsIy;kSj|pv>y&gG$a7J zp;*V`h!lL1c;&?k^m<2v(lH`+1ay9x(iuXZHOUwtm235*Wise%7x~ngF zr`6RFQmMF@j2}p>#*bU3sR~jllnsxpmzC&rawIu9gDwj>{ZAdpQHl)RZIEkxNN6F6NyAq#tVn0WfpA055)${V+A-FZ>pqfhTu z(%HOp(FNzT%$A~fs|)U1=KTWT44}SfFwPe?{`JW{4Tj&M=il1E*Y5ySBmTm26y}zq zMl2C4%}$OTeE6Xs9@zW*lXRV7j4_($?X?!gyH=3DRW-l**g9JbzjhRV8C2lE{`R;3 zCabFdlU^pQX)}X`!YDr8i?@GtAGD8r=i|L?LE-iKfmRAE&1N`!1{76X z(Jet=L>8lI8K&|8JNsnVH3Z@adY%(;3Gl^Wb$r5GDwHHD{FN)(@=b5LIY;Zg3+2jO zzEGUZ7YcEuqwPaQNs8#YrrrI8e|po&W5@F}{1?V7CG0^%#;gGYzgjUYRd^7PsHUQ0 z%3mxAS=R+^DN!9!T%rnkh#Y{vL`86fKE+gstAzhgH-bu}Yr<>HP1<;3+k;v~1y{ZD zjk`8)KYtK`hOJcgcM-1yI!%6o>!e?|qsMyqeWN@+t7<@v`> zP0@y=Y$mxnean~r;l5NNmP@4)g>~|Ky(y1x1ay6Apinr1kH_%#&u-)Y%x6CH3Agbp;ZDmaW(DQIbgMdpa=9$!^LZ(jOsJ>G zT2$2v2LpOrFr-I(K|RzSMpv&0zvdAh!$+gG7A?C7b%m`E8v5b6RY>P6;4vkrC}k*U z9vEAetVy(|AU=N^=HCYvRBI-VPDhbMC6%CrT%x`5Xl&M%*Ic`ba6dqKJ36CbeC>^z z(e8=MQkX0@o6PTyElf_Sibrn8H{GLPXa`d&VQOCxma5|ShGZ!@9h4k81Vb092Y=>M z0g-}5%Au-m;aj(asvD*UU#DvLbfc+7iu$T^F3Az74kA!2$2siZ^Vq(XrP+m%t>R|`Vl>;s>c}~THm-EQ-U+C?w{V+TO0rB`ul5*-*DvGD92w} zUDY$WoIW=-_Vnn1=a2vRzVDAWLG_BOhrb^5ZywHRrNQ4E>0dI1y_c*5_#e04`u?<{ ze2y+mzhOj&^Z5g!?v3B*ID+F}{NfisI5RWz7uCP(y5dd7&X3(~NiF!0iH zQqwX;8sBmdQD~`B(hfd(&xbI87y2a0+7_|oj!r{Vyt-5_fGDOwS;<+_QpJ!`_!3?O zHJw2`HVE-`&=t%|6m)f}hE4&UmIw2hn(b)e}(rdiL38i?`o?`#bS{`Pld`yxu(L z&%UYCrk&~)pqVC@z39jnR;EN@W=s?(_DT7%XM~=Z7p+o-n#LbG1fS1mgu)>sh=DtV zjv)~AVf_t|-iolU88OAK?dTNn8p)LkCMdxnadBM)E&TfByPq#EM(9fHL+9MH&go3Qf ztI#H1XB+Pe<@jgH>=Wx&?qAsW^Q9tq6%`@=G(!C%B-6=~UM|ib-22qeo__l0qLn43T zd8s)5oT$tnB{>Pr4zCY5@So4Kq_B((5{t-ev_+H9O=))lzFbzZ2D;3$$^{U}FA_V6?6mE;`*mc=?Biqiq zxVL|>XRxnd>Fe1bdHp_gdMd9mBQ3rVejoJzANIZkOseY2|J=9MtG)LXXqtuw8fe6A z0FekHBAd~;WWt|-yChE3aWsxjOmI)4jvFzWPbCxyCQ-J3P`hb(;MCNzEpKr zbuF*zE%(m7ue*9WZG-y%Mq~7y?|WZuuU@_P>i&M`oO{pWJbrM`i6Z;H(8S)z;Adsv zS>|Lr1fN}l&z9jDslOf>GNEUF z8$tiI62KiBHr(CIaksKVQt$^T`1gniZJ}fJY3jdcve|yN?cKY#?CGbUzBC2?!trCs z+?yWI+Y@6z#a@upscFiBU|66I(HIF3%(2@2EL)Bx&9dhvva0kVq5q$wnw%392-kd! zVpSg?MhHfG4M!5O{u+J*WYAwtSooXG<#wBHx6^RbM_G|svkHX{M8skdFp#5@PANW5 z;w9qu$gGPk$;=!#&YwSaeL@tosclZ0>+5d#@Zn!To5BYeEQVbBg|^Ly+(G)=>a1WP4?)W)JB z1=-;cWw%?VWXNN~kPO4%)JOyv38b|C5CTYnUm8LNseSm<=Pa62IJ#u2$Lq@;KfcsM z-2z^cWve8bpOOJ<&gpSEKw+JBW$AA^6Mc4B?~8@?veN53-(TdEMd-24Po04t2=?{? zB~siG=;mZmh+-qz814<$-TH4=Y?xMlitj+hp6(I+^Wn4mc$l^)BWU-b`S&Ndu}5&hkwYPD~8cIDjwe_@%(yOmN%#NiN#{%$tRz@sG_3c5qd6GXOH5sUh>Pe zXXp;W3DupWU|aKeh-IGyo^g}uu$L*ncLP@A{T+B%1R$}j0mORB;ei4WRwE9!ASSRW zH-W{|TA{Nh9k5zUEs9odM~S+Rk=}9y;aCujWErH~hXJi`ZLC$uwQGK|pIQtJ^!Mrz z(hq{sy;t;=J{55|XEFO+jYeuV{p??6pD|h@XBG;?L_l_il4NU*N<4}V7cSt)Nt1X| z-66xK3MVY6F zkD#Qbi6F~@VVay4jY3~%C#bPls#aZUC15BKh{J#{4p~a1mnceJUq+fQJu7X@*a?&J z3&&2#%*@Hp&CN~o`}{Kf99gZ?Ow8J}gV*B$4|NxqmS#my9BlTIb?~898_Re$tYRho zY0aA6k1=*#tOsB?8n>E#vM#=%NYwh@s7a5bF_rVUlra6zI+6*s<()TPdC{RL+zT83 zaAcTf9-2dM4gvV_(rk?(p96fh=mvZjK>w8!z&(HZlRpZugKlN)waYMC3uCcQMM2n1 zHRvn!*s;{U_uY5jnj=T5@1|gqET6xqfGodxwGK#!v7{NsLo-x0D)3&@RNxBB!5sBZ z0BPC4;}D2+ALzA(=RH1QPEGa={}Vs4oyrm6s;j z+1X^)tXX*K)TzKMdzNm@-fwSjN4lnwBt183SqYI?%&II9YHlViH8n;o9Oi}qI%O%K zVJ^eaM`2(eY2Z;DvOk}ek>%wOn?k^7^0ZUOE z&HCdrk5vzgpc`IXb9h;8Jc3roBLwCg5A^U|0R2}=0QYU&cuJ6vH>eYqVfpczR+p!$ zRYQC(2COD}{OX4vd1QL!;ltOazU$5@AyY28N5^>{=<~@i-QNX2O5Y4Qq1~{*+6m3k zLLd{*g_fKJ(AMLnZhwUS#jK7${@-eeR%M<3lz0v~0P_e~k3g12Yh~4Gs#S8!L_B?u zx(Lw_IO=zR6zc%JU@C-*W`Y@uL%jYY6y5P6r#F7er7VN2tgOJ**IZLa2fP)j$P0`F zcrNKsav~0yg)@U1?0I$Dolne*yDRzfM!Xg!^%7%_3 zO?-D_4@Xk%iRh^p6&2~%TyqW1%gaMl;}70jmIYYX(!xa)1;u0;87vY=*U8?${?!O| zb&-yyCNc!@XvlMJgl#BE@FTn)N*(|sbi2*UDR7N1om%8joU&uX%Q*Y!IO(XN>uhE?@KNuzB;V9=I{=jxvG5QUZ?u)?tJtskHcN!GtNkGyj zqC@Jb6v%x*tkPPn42!Yj0_c$p&sk6CAXMxLtU3z84$mP6$xaNJt#X@`{9u^+EH2X0Gv2 z2hXbbqy{e~746(}&sFEmn};dcpm;pa{vSkvk4*Z9L`0GAqNZ?yl95DJslzl45o7(% z)vHJPv$*3t=Z6sk8V35*J}`_-h975mW!%q9*-Mgx)3k(TX1iP-N@fxBIA%6E4)D>i z&r(1~@Yy0AXxOCPNNKj;dBA@q1n`>|UYO8_@n6FjPqao4A!=bfzB@ybUZ8`z)-a3- zbQ@2%F`BNU`|iKLxTCGDJoWv;(bMttlmFQmJ+2t0O)VjD(BR#zJ0MoQ6Ut|}k$&1a zus>QxeMJNOVmr*s4MDT>Oo&ngl5mt;Bo7GGOpdqILbSdLnLTaP9yFl0s~L=V1bqHX zdQvXHvJ1rYeBg7(0P<%6u*ROuCD1jHSt&639gQ{gj0E8DJr@gFZS*@bH^ zlwH1<9t{yA+Jn^2W8~5$3$92M)t!xS76cDS9U?31wD zC9}kdhI4 zLpa#?yPpk$Ulb*^e8tTx$IM(B(Gy{6HH07$4w4zCO`EM|xR$60d68idwWa0m9dEqT zVrfrII3u1U(RdO^y8!o4LXapSu#?eL9i_~DS(eG{*|W6;3l^yP`T2M?)#O)RdF9|> zee{VZ#7??Xk0fzAC1k4gv9lle`WN_X@R!(!8v>N!L~uN9f1>wBA^$u`2K?7y0sQA*{&HTAu0I+wjN$?RRLf2z4&?Fto77x>B$!NUeS|m+gv2BT#hbtX z{ZIFN^wCc=O>?Afz?(GPPMzMCRJ22GKK`@*2M){{iIi&_#PYM>{Fo3GY$ zYT_GLTyce7R#s+EKOeKkCv2uofc}nE5lND}9S$MJsvj|PA7hO^Cht74*8l$%ZUi8G z9>CE^X8-5N7XkY50Q^PYv*oKK09L)H&ono7C6lwrz@N@y`twxvfJ9AytNk@=tRc${ zyd+gdbiMv}_uv2X>LW+yrv`~Yweg&^VuN?);@NZ0g`9K`eB9OpTR&-|qhEv5E?ENU z{sMUW*%zr+ZiTd*(a;eSAs%i8D4h;Pm#zeXbU|Rt?;x@FWss{f+>O*KFAW_9U~0?uf7{DH3iso`cnAoC0E0tmmcFAUwUv5 z3}-L-{+1<6mPr3Q-1<8RYaDX5DDr76s*!@Sp*@;=Zo-*C5`vSM@fcBqEhJdI2X*dx z6NQ_qh?$HJ0zW-H9iM;x`C55-x#@H|S$@CunYD(A5Mlm(7X^M)l32|!27JR|7;)<7 z8(;U>_>!LuZ;%OJ60qb;5{NBdrwc%V@1~k{U8AaAqW8z0gNSh?E0L)583t=n!*Vb= zGQb>0GFg0J-@b_(H*TEX)6isKTs?GA!@#LhvBKoB4jI)sm1Giow{dY(VYZ;BIcEWb!OG6#P?8KJE1- zi_eq#yTK3U#1o8&-05^ovl`YA5{<|uKTi5fSS3G5b9qU;rxUslY~_x=`V^P!?H-(r zaypgd+_`f@^XAPrGcz*FElaF3}Ya4uQ2CT@w4Bu>6dg=Ee zZbsqxCw>FTM1{5Xo+V9&>h=%mnN9$4>O?3gDuk}L*Mrf#4FplJG(PJg&ond3$m3Xr zUuP%GJk1SPUCcw_EFPfO2}jowc+KyI23~}4s0}WdYr?d885&z9cs&{9cCCMoA0(;t zj91GiPrIY8?x;T_JG~=az4W4r|jm=@tEqy{kw}S_yQR}1O!%aff z3lDL9t@UgT;#=AV6b;{N-8O_nWN&Z$rPktyyoR@kC~I@gjhg@r;-@{OK?)S>M$m) z6u$qx#n4^d2+tq-FZwG6l#3#?aM{qVv2MG$;2ysSihlA_=xwWkmS0~CSl6sN``Aha zC05j#Q{rH0DM5EW0FdTGB-Sf|Yl0KH_W9tIHzvZqW&$;h&1l6{CR}<3fzCTLc;X$* zJ=k5r@$w{bW;krY&dTZ_RKo zY5r(4Ijzr>ZVafq#JVIbBf-+XSJcJ{Fsn#&N9^ zMX{cjWxQ+m?t)F5Hr-QIRkduOM3p6Z)KLD-_x#3bqZ}mu4uRh0C{)q|Rfs&8NQ1d! zPKSlF&Vg6o-3q%~w!y{3fPbbw{ck8BTa9*V1&jvg)U%=NXE#H%D*)Zw{sIOCKdW_b z4uGF|9ao*g!!K_zQM?}D=&c+H&&N=7p$fGhB;lcF5Yz=bS&Knfb1i`j&W=O-MjoE8 z*SUwf4-JCf>v8Y>*QHBtoy2*;&r8tge%;}yWUOF`+<@MQ)bM83E?CJ zs@?@fPr`Vr2}e;dKS}xH&pZZ+cS8QcD`CdNadMu54 z7-zW<{PrY3HM^*fZXjSKF=pMRLzN70{>>cdIPx9Jx6m~o=M1`cI`2bXF65woNVHTin_!_yEi;Y z!VOiaOT`%(8Oi0#m#e3qdMajWI`{(hbV z&x<+;sEC9q_*I#MLYW6g!i37C4ng`;1=J!?bOKud!+K`g3ml{sWdc9xG(f&_kUQ=S z@Hq3}=f~i$xPMmJ{fBn`-hf2ZzUF_<0q!+H9rKYxz?S zg2D?-2#?|5xosSO?}pAn&7Yf-zV8?RetQ?=-WeuBqG*_b zEss2Q(UEuyVRZc+X7+8d<;xSmP`Tsjr%_T6IE`wvY=ARA-nQ+Qw#LR8wR`tw1iQOW_+#0; zK$a*@d{Meg=JFD5QBBa@{mn0T^ZHi5vwtg7H~}Af@F&6ZoL!3ao9_@x(!u>cRhjRqdXjFC-5e9TRzAw=iBzaIXK(zal1d9Tzc{i`Pn|> z%vqVrsN%w6!n=#35pi-<7e+U@ebWt|S19-shqi3F_WhS%K3G^-7^nVy%bYoLV)^;` z(A(QfuDk9!>n5_vJ!(O?sm4$5b~s#d-am+qtSe zd-&G6I{pVMS1zils=BGQwssmN19vnWKH+yINhGo&VuvIXFg1;K~iyifQ}(O#n;B0KD-cf^{G9a9ErU zF@HknJ+N(XNz(0d?>xI?!u3lF9QvHOag;t?h7L6oyA7+na#!<9m!Co=e(d083T|8vE%hbPom)}s<0Dy2C0c9qHTStm~$ zGkMxI!K|!u%xdjnoJ8&ISB`hPcTxYIPb3o7vg1H3Kda4+De$3JmL0v4q{LX=0J?)> znjzUVnU5c}hnOwjNdg!u|MAQ-X!o{ld`(3K*Ir#Mt+@XBA2c;KUe;JyIisn%+Lct* z6Mo;}m9fL)AOaS#XmC`!5?I8VWYW(z^Cmb<0#D`hP;)AVhu=XErtSdeLZBNO3U%}e zdQ2a@n3JbW+20JKtPRYTyJ}?fX%_im}K_sS#Mu-@g*$rhPw5b6&XbXlYv~)>C6bGrIis1Y^vEq zZe5>4fy{aqz`Awo*xe8*@O=rM&*+wAXH*nLo#T+$AF|s)AG@i>PufGu7MlRRg#61x z4{`fb*q>NhlTGg zT2#_dS9fD)YwNtWnwp$oXXgp$4g`TGyeyDpEIGIz1$xq-=Km?r@fE2{V}vkg&K%e2 zGiNUD_4zIiOVSwjfsAo`wyIu8wSOxGy{_@R91(=HZbgw9=vfH@iOuL^+W^5WQ&bS7F!eL~D5DHi;L)jX zACOJ6`Imp6%sg9c`R)i zbHW+<`FQy)x4aq+2DkN8RlPedJ-xZSyqx(Hd`Ob+4LBT^v2I|@%y%2c3)JMljV0$q zBuUa(TV4iy)9hoDdUvf_6|#qlEj9ssLuAdp_oB{@4zcFYA*t=i5#CHDrL!)&=!Rpp zwdV!e+sB`}e7Uo*%&JJ9%2_q()oi2MeLDsFSz%F}W4QuUv(wl2P`~~aY6-AHrfgC# zL0y3!(KLJL>%^~Yjcv@#i>QbF^(y@ znRzje1qCjNC5bUX`H4VodW?5|N@h%AN=klSaZEu@X?kX!URh>JYQA1ceo;|sUP)?E sOi^laerZv1YH>__d}dx|NqoFsL1hUC&}^IB{FKt1R6CFhih-B`0Ic&Yc>n+a literal 0 HcmV?d00001 diff --git a/resources/__init__.pyo b/resources/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..c115d1aad7c74cc0745bad16490de0541593dbdc GIT binary patch literal 174 zcmZSn%**vm*ETqr0SXv_v;zv@#i>QbF^(y@ znRzje1qCjNC5bUX`H4VodW?5|N@h%AN=klSaZEu@X?kX!URh>JYQA1ceo;|sUP)?E sOi^laerZv1YH>__d}dx|NqoFsL1hUC&}^IB{FKt1R6CFhih-B`0Ic&Yc>n+a literal 0 HcmV?d00001 diff --git a/resources/contenters/CXZ.py b/resources/contenters/CXZ.py new file mode 100644 index 0000000..baec708 --- /dev/null +++ b/resources/contenters/CXZ.py @@ -0,0 +1,191 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import re + +import Content +from BeautifulSoup import BeautifulSoup + + +def make_category_dict(): + category_dict = { + 'movies': ('Forieng Movies', '/films/fl_foreign_hight/?'), + 'rus_movies': ('Russian Movies', '/films/fl_our_hight/?'), + 'tvshows': ('TV Shows', '/serials/fl_hight/?'), + 'cartoons': ('Cartoons', '/cartoons/fl_hight/?'), + 'anime': ('Anime', '/cartoons/cartoon_genre/anime/?'), + 'hot': ('Hot & New', '/films/fl_hight/?'), + 'top': ('Top 250 Movies', '/films/fl_hight/?sort=popularity&'), + 'genre': {'genre': 'by Genre', + 'action': ('Action', '/films/film_genre/bojevik/?'), + 'adventure': ('Adventure', '/films/film_genre/priklucheniya/?'), + 'biography': ('Biography', '/films/film_genre/biografiya/?'), + 'comedy': ('Comedy', '/films/film_genre/komediya/?'), + 'crime': ('Crime', '/films/film_genre/detektiv/?'), + 'documentary': ('Documentary', '/films/film_genre/dokumentalnyj/?'), + 'drama': ('Drama', '/films/film_genre/drama/?'), + 'erotika': ('Adult', '/films/film_genre/erotika/?'), + 'family': ('Family', '/films/film_genre/semejnyj/?'), + 'fantasy': ('Fantasy', '/films/film_genre/fentezi/?'), + 'film_noir': ('Film-Noir', '/films/film_genre/nuar/?'), + 'history': ('History', '/films/film_genre/istoriya/?'), + 'horror': ('Horror', '/films/film_genre/uzhasy/?'), + 'kids': ('For Kids', '/films/film_genre/detskij/?'), + 'musical': ('Musical', '/films/film_genre/muzikl/?'), + 'mystery': ('Mystery', '/films/film_genre/mistika/?'), + 'romance': ('Romance', '/films/film_genre/melodrama/?'), + 'sci_fi': ('Sci-Fi', '/films/film_genre/fantastika/?'), + 'short': ('Short', '/films/film_genre/korotkometrazhka/?'), + 'thriller': ('Thriller', '/films/film_genre/triller/?'), + 'war': ('War', '/films/film_genre/vojennyj/?'), + 'western': ('Western', '/films/film_genre/vestern/?'), + } + } + + for category in category_dict.keys(): + if isinstance(category_dict.get(category), dict): + for subcategory in category_dict.get(category).keys(): + if subcategory != category: + x = category_dict[category][subcategory] + category_dict[category][subcategory] = ( + x[0], x[1] + 'view=list', {'page': x[1] + 'view=list&page=%d', 'increase': 1, 'second_page': 1}) + if not isinstance(category_dict.get(category), dict): + x = category_dict[category] + category_dict[category] = ( + x[0], x[1] + 'view=list', {'page': x[1] + 'view=list&page=%d', 'increase': 1, 'second_page': 1}) + + category_dict['year'] = {'year': 'by Year', } + for y in range(2015, 1970, -1): + category_dict['year'][str(y)] = (str(y), '/films/year/%s/' % str(y), + {'page': '/films/year/%s/' % str(y) + '?view=list&page=%d', 'increase': 1, + 'second_page': 1}) + + return category_dict + + +class CXZ(Content.Content): + category_dict = make_category_dict() + + regex_list = [] + + baseurl = "http://cxz.to" + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124' + \ + ' YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', baseurl), ('Accept-Encoding', 'gzip'), ('Accept-Language', 'ru,en;q=0.8')] + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 2 + + + def isLabel(self): + return False + + def isPages(self): + return True + + def isSearchOption(self): + return True + + def isScrappable(self): + return True + + def get_contentList(self, category, subcategory=None, page=None): + contentList = [] + url = self.get_url(category, subcategory, page, self.baseurl) + + response = self.makeRequest(url, headers=self.headers) + + if None != response and 0 < len(response): + #print response + if category: + contentList = self.mode(response) + #print str(contentList) + return contentList + + def mode(self, response): + contentList = [] + Soup = BeautifulSoup(response) + result = Soup.findAll('div', {'class': 'b-poster-tile '}) + num = 0 + for tr in result: + #main + info = {} + year = 0 + num = num + 1 + title = tr.find('span', 'b-poster-tile__title-full').text.strip() + originaltitle = None + year = re.compile('(\d\d\d\d)').findall(tr.find('span', 'b-poster-tile__title-info-items').text)[0] + link = tr.find('a', 'b-poster-tile__link').get('href') + for i in ['/serials/', '/cartoonserials/', '/tvshow/']: + if i in link: + info['tvshowtitle'] = title + break + + img = tr.find('img').get('src') + img = img if img else '' + + #info + + contentList.append(( + int(int(self.sourceWeight) * (251 - int(num))), + originaltitle, title, int(year), img, info, + )) + #print result + return contentList + + +''' + - Video Values: + - genre : string (Comedy) + - year : integer (2009) + - episode : integer (4) + - season : integer (1) + - top250 : integer (192) + - rating : float (6.4) - range is 0..10 + - cast : list (Michal C. Hall) + - castandrole : list (Michael C. Hall|Dexter) + - director : string (Dagur Kari) + - mpaa : string (PG-13) + - plot : string (Long Description) + - plotoutline : string (Short Description) + - title : string (Big Fan) + - originaltitle : string (Big Fan) + - sorttitle : string (Big Fan) + - duration : string (3:18) + - studio : string (Warner Bros.) + - tagline : string (An awesome movie) - short description of movie + - writer : string (Robert D. Siegel) + - tvshowtitle : string (Heroes) + - premiered : string (2005-03-04) + - status : string (Continuing) - status of a TVshow + - code : string (tt0110293) - IMDb code + - aired : string (2008-12-07) + - credits : string (Andy Kaufman) - writing credits + - lastplayed : string (Y-m-d h:m:s = 2009-04-05 23:16:04) + - album : string (The Joshua Tree) + - artist : list (['U2']) + - votes : string (12345 votes) + - trailer : string (/home/user/trailer.avi) + - dateadded : string (Y-m-d h:m:s = 2009-04-05 23:16:04) + ''' \ No newline at end of file diff --git a/resources/contenters/CXZ.pyo b/resources/contenters/CXZ.pyo new file mode 100644 index 0000000000000000000000000000000000000000..acefdc736e6a0509dbe9bf1fcf4fb5350b38e6ff GIT binary patch literal 8407 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 literal 0 HcmV?d00001 diff --git a/resources/contenters/EZTV.py b/resources/contenters/EZTV.py new file mode 100644 index 0000000..782765d --- /dev/null +++ b/resources/contenters/EZTV.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import Content, re + +class EZTV(Content.Content): + category_dict = { + 'hot': ('Hot & New', '/', {'page': '/page_%d', 'increase': 1, 'second_page': 1}), + } + + baseurl = "https://eztv.it" + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124' + \ + ' YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'https://eztv.it/'), ('Accept-Encoding', 'gzip')] + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + def isLabel(self): + return True + + def isScrappable(self): + return False + + def isInfoLink(self): + return True + + def isPages(self): + return True + + def isSearchOption(self): + return False + + def get_contentList(self, category, subcategory=None, page=None): + contentList = [] + url = self.get_url(category, subcategory, page, self.baseurl) + + response = self.makeRequest(url, headers=self.headers) + + if None != response and 0 < len(response): + #print response + if category in ['hot']: + contentList = self.mode(response) + #print str(contentList) + return contentList + + def mode(self, response): + contentList = [] + #print str(result) + num = 51 + result = re.compile( + r'''class="epinfo">(.+?).+?8FV2=lIzN7!t+~Fa|6sury!?ASQHy9TZqnWHMmi1gsC{4EvU`*Np8S6iK>O znI$FvDlk^&__Vb#GIP@KJRJ{I#{1gvFCRUx`_;P6PmCH29k0|E`Rek@D*r+xYQ$TI z+Vq5%IU+`AJ>&DiNT@W7^{712K2()0&|=tu+j}BhqWWib>B~(G#hl+g-(;$BiEHD{sR&2L8?JMD zaS;}u@KjJ3r|*Vd?!N}%!qa`qpikPdmpaw z&8>EGqt)V@+Yztvom$l1s_!;x5#QO3cD7p^A?GcG3Kn_|KM`uGnvph=C(@w;Y&gmP zJ`!wUUYhWsIFd+oEY%T=6Ff#~orm{-EB5<}RA&S4C``F1C|I}E=b3g(+``KBp>z5D zYW4W|I2>f-P@6#&)j*YCs}IAn`VT%$H-qxuIB0+IePfltctkz%Hw+Su6)=Uq@$IF2 z&!C^y&_~Ja zw`-;OxHbSl*e<5e^()k-sD2VI^U9ve5`AoWv(4ASl?QxpdvERDBCq9nD)(gXnR3-n z?tU8HUE`H!PutHMOFUJFl0T90pb9!fmid>7-Z^uXrFo~t@AT`dzvF%WihWUwiQ`v^-$&~iAKyFz6|JhGi zzbR5XaUi17xm@F~Vn=0Lu@QMLda3*f^Pl5EG*2c|Mt%X~sRNYV%KEyYvcvG#WIFYR zvODN;yYh4GCXo20LjD_XcS{Nr54Zi-YQL3 zvDb^2EW^7q)5}!Tx9Cs`+)u26MJyr%eF*IoVJl>|mjmi{$0qf35133eMSLUT z1=z`fO7e0cfzBEV!Vj$a6f8@rXF(}=uW+aELE&m}s}Pe16dN+u=ldTZDBn0_19ny< zyv8+`k_V!|UKc34$Q-hWJiYuYCF${3e_@>h6#{aO^qkF6f#6KP0|lsoGaSOG6P&=1 zC{vxxoZ^5kv2}XP;ephHng<2_v&@y~k1A=7HX@ozirvKTbek6?>p>K}$eOU!B zR@fdiv?>I{O?4NeUB(cn!rIRkWUhcT3lA&dM}JyeuZo9wt_waivj5paWh4eD1zKA0 z=en;mc#RZOv88l8c*-f4N?$7}K&wKba}-A-eaYc!o+}8@t>^J}yVhuUb{~hiNYm&h ziPIYJT4sqa7nM0jI6gU}_9Xp3P@%N=8jRi}>Rk+8I2(`r`>3sP>Z0G#BBw>FUUJY; zo;CidP?<=(7uKGj=O^2Z2A5ip(K|5cF@AOd11hjkLKPN+Tfq%bWzhH*uLot!-Vb=8 zLeaF;&p&nfm`G8r|L6wd?-_IhX;vr_z7f0KOpIi=>*&PkcG2YHl&04(J#Xi3qGA_a z2gk!h^hcsdKBC-2BpQ*zi1ze(jNT`Tyt{~}r!L{v5@A<%8$bI21`21TNMkXW3$B(* xg)7DL@0-^uR2setyWK>`@SB2LpWK9^--GtrF5d~CoApUH9^QZ*K6fSH({~c7. +''' + +import re + +import Content +from BeautifulSoup import BeautifulSoup + + +class FastTorrent(Content.Content): + category_dict = { + #'movies':('Movies', '/popular/'), + 'tvshows': ( + 'TV Shows', '/last-tv-torrent/', {'page': '/last-tv-torrent/%d.html', 'increase': 1, 'second_page': 2}), + 'cartoons': ('Cartoons', '/last-multfilm-torrent/', + {'page': '/last-multfilm-torrent/%d.html', 'increase': 1, 'second_page': 2}), + 'anime': ('Anime', '/anime/multfilm/', {'page': '/anime/multfilm/%d.html', 'increase': 1, 'second_page': 2}), + 'hot': ('Hot & New', '/new-films/', {'page': '/new-films/%d.html', 'increase': 1, 'second_page': 2}), + 'genre': {'genre': 'by Genre', + 'amime_series': ('Anime Series', '/anime-serialy/multfilm/', + {'page': '/anime-serialy/multfilm/%d.html', 'increase': 1, 'second_page': 2}), + } + #'top':('Top 250 Movies', '/top/'), + } + baseurl = "http://www.fast-torrent.ru" + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124' + \ + ' YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', baseurl), ('Accept-Encoding', 'gzip'), ('Accept-Language', 'ru,en;q=0.8')] + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + def isLabel(self): + return False + + def isScrappable(self): + return True + + def isSearchOption(self): + return True + + def isInfoLink(self): + return False + + def isPages(self): + return True + + def get_contentList(self, category, subcategory=None, page=None): + contentList = [] + if not subcategory or subcategory == True: + get = self.category_dict[category] + else: + get = self.category_dict[category][subcategory] + + if not page or page == 1: + url = self.baseurl + get[1] + else: + property = self.get_property(category, subcategory) + + page_url = property['page'] % (property['second_page'] + ((page - 2) * property['increase'])) + url = self.baseurl + str(page_url) + + response = self.makeRequest(url, headers=self.headers) + + if None != response and 0 < len(response): + #print response + if category: # in ['hot']: + contentList = self.popmode(response) + #print str(contentList) + return contentList + + def popmode(self, response): + contentList = [] + Soup = BeautifulSoup(response.decode('utf-8')) + result = Soup.findAll('div', {'class': 'film-wrap'}) + num = 16 + for tr in result: + #main + info = {} + num = num - 1 + original_title = None + year = 0 + h2 = tr.find('h2') + #print str(h2) + label = h2.find('span', {'itemprop': 'name'}) + if label: + title = label.text + year = re.compile('\((\d\d\d\d)\)').findall(h2.text) + if year: + year = year[0] + original_title = h2.find('span', {'itemprop': 'alternativeHeadline'}) + if original_title: + original_title = original_title.text + else: + try: + title, year, original_title = \ + re.compile(u'

      (.+?) \((\d\d\d\d)\) \((.+?)\)<', re.DOTALL | re.I).findall(unicode(h2))[0] + except: + try: + title, year = re.compile(u'

      (.+?) \((\d\d\d\d)\)<', re.DOTALL | re.I).findall(unicode(h2))[0] + except: + pass + a = tr.find('div', 'film-image').find('a') + link = a.get('href') + img = a.get('style') + if img: + img = img.replace('background: url(', '').rstrip(')') + + #info + + info['label'] = title + info['link'] = link + info['title'] = title + genre = tr.find('div', 'film-genre').text + tv = [u'Зарубежный сериал', u'Русский сериал', u'Аниме сериалы', u'Мультсериалы'] + for i in tv: + if re.search(i, genre): + info['tvshowtitle'] = title + info['year'] = int(year) + + contentList.append(( + int(int(self.sourceWeight) * (int(num))), + original_title, title, int(year), img, info, + )) + return contentList diff --git a/resources/contenters/FastTorrent.pyo b/resources/contenters/FastTorrent.pyo new file mode 100644 index 0000000000000000000000000000000000000000..01e80a94979551fcedfc3bf4dca4b096c7f30466 GIT binary patch literal 5992 zcmd5=&2t>Z74Mmq*ODw*AGWc?hutADtU%h81qd*T&05%4u`Ii0Wn{aSY>jq$cgLEY zSx@&!EVU{i=8__Z+;Yhwx75unb zzwg&QnSYE9e-Zy~y()U244!Y|udk!=gt&*+5}qvrOWZ>z?c3s>&HaoBGNPFg_cFrr z286Q3eOuH3bVPhC#6uzO-Wwq7QZ7qG|85I0Eb&>7;#h@7#j+J7bw8A~D3*6F-&p3= z<*3z;{d&X5-13ZEm_NTD-*G*^DN9>Xyy-H`HcjL;PrO-gx_*$aM$O@rdc)VU6-V{h zZAx@&u~Je;HM8T!>Vj-XiLAPzjFsnW6Z@NqQPMZk4ZQ-`Xhxo2YcnBCCZPu|O+!g= z+tf0u@!;*X+wyG{s@M(WtzM?VvVtUslQ2&;;f8fW+&$wVm_8pix6kPaa#s1sj-KfXSi=v!oIAYgu;oV zM%02>4N!%kJAM$zO(hepYDqB5G@u!|v9f;c=IwP^T)QhbijGrUTfh4TpiLvfs@hg5 zEx*|cd4M z(UG@qJGX9@uH>aGK~><8DSV5n$!nTXtfZ$5JV57D``?9uHP{P0*>JZN3|&?JHkfl| z6|U7+@8N`bUpI)tItvO`_8kh`t<+=~nOUj9>54jn7)ng8Q3MG?$f|7#|ugMM=vX!^~Azn_fIT3d5rWiNC%EM1?T4gnxwM5dr9D zD5AWKSVY7j&=$R{@Q#Yb8s-Nv8WP?x106dAXaqo`!aL4DV}}5Z1872clMHm?5TKJ{ z(FZH1g!cr%PYZ8~!KV)ae-c0dq}=for3~+B;XNa~Gvag&Q)h+B2P z)1_{qPqvV5^|i@99YW#W?QzIre?y|^HX&by@ImoO;$S}rYi!Nb zl=(Q(!&trz(77TwGP;7{jp%(OJGbykeqQD_{Lq7K>=;E zmt)XXapC;S`SXuf=NHe*l3R0QzekoG#8EXBBmIv7vskUFmYKT}R#Aw;Iy+qbeZO^Z zan%j$3A~G~6eqJPeB;57=ku>s$tnB)W%M<wI!IcbLGjQMM2XnJo+#gGKZ^xx7bRPW&XCy3i1dZVi5+xzSagPYIK*UefIOCxJtjKGMEp-`;l8^g!T=4fK0@5whqD6h z2y?~`8vm8t6dO!q2XfMbRB_zyQ3c+hh(EB<64gQR-~%iCxo9u-$sgy=5VynPG6ck4 za1YQ+6+v5+GsF-!0)dV2C&IF<_UnBLW8aAa6vq@czyLmI?}V1P)6)&qJWerBdYWJ% zM@45;+{b}>l849p!xKCl6P+;;|II>sAHtrbO97!Dr>g;3Z;W*^!WrbWSn2>Dx|~8U zots84H4Csp*~h~MM@5a&marZa#Re#pazB96u4zih ziK)%K#)0bj+kA@V!~71;1AG#$;)0=l$^)FPI2{@C{l)_458c9rnbKG2HWdfDZ&Z_l zT~k>u=W=B){mztU3@w!zXg1W56vuu-$a@*bar%^#YU`ZER;6wAiZsDy49_EOs_L8NaUj&$`CRh zq0BI3KxaEf2A^9zWqbo<%E-J4UlkHkX!lp$Pxn6Dd)WPb_p|OFx?k*l(*2X%`>6Zb z-iO^kc0cWYo;*cRzu9}Z_YtQ5jLEO9lU&_jcE7;NU%H=t1$Xb0gl=}-UxWVVd%xKG z*+Ig4pKuCJZ)(gRv)smsC`T%H@F#D>6&#m4ylA?qoc<+U+8V=q}5d|$_Z5G!N&X00;=!@wB^g-Jk8S`(;jS?g&_ z+Bu5ngEzGP^^GrJbbb3Th{Nu1YdKOl=YdLvQbMI-C{!vH94e9kLxOy(Rkde%CJFWKR_0nFih z)H;>T+C!QCcWf$0NtR=wQt_fH%d&C;g F{0D|I*lhp+ literal 0 HcmV?d00001 diff --git a/resources/contenters/IMDB.py b/resources/contenters/IMDB.py new file mode 100644 index 0000000..6ca8696 --- /dev/null +++ b/resources/contenters/IMDB.py @@ -0,0 +1,248 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import re +import HTMLParser + +import Content +from BeautifulSoup import BeautifulSoup + + +class IMDB(Content.Content): + category_dict = { + 'movies': ('Forieng Movies', '/search/title?languages=en|1&title_type=feature&sort=moviemeter,asc'), + 'rus_movies': ('Russian Movies', '/search/title?languages=ru|1&title_type=feature&sort=moviemeter,asc'), + 'tvshows': ('TV Shows', '/search/title?count=100&title_type=tv_series,mini_series&ref_=gnr_tv_mp'), + 'cartoons': ('Cartoons', '/search/title?genres=animation&title_type=feature&sort=moviemeter,asc'), + 'anime': ('Anime', + '/search/title?count=100&genres=animation&keywords=anime&num_votes=1000,&explore=title_type&ref_=gnr_kw_an'), + 'hot': ('Hot & New', '/search/title?count=100&title_type=feature%2Ctv_series%2Ctv_movie&ref_=nv_ch_mm_1'), + 'top': ('Top 250 Movies', '/chart/top/'), + 'search': ('[B]Search[/B]', '/find?q=%s&s=tt&ttype=ft'), + 'year': {'year': 'by Year', }, + 'genre': {'genre': 'by Genre', + 'action': ('Action', '/genre/action'), + 'adventure': ('Adventure', '/genre/adventure'), + 'animation': ('Animation', '/genre/animation'), + 'biography': ('Biography', '/genre/biography'), + 'comedy': ('Comedy', '/genre/comedy'), + 'crime': ('Crime', '/genre/crime'), + 'documentary': ('Documentary', '/genre/documentary'), + 'drama': ('Drama', '/genre/drama'), + 'family': ('Family', '/genre/family'), + 'fantasy': ('Fantasy', '/genre/fantasy'), + 'film_noir': ('Film-Noir', '/genre/film_noir'), + 'history': ('History', '/genre/history'), + 'horror': ('Horror', '/genre/horror'), + 'music': ('Music', '/genre/music'), + 'musical': ('Musical', '/genre/musical'), + 'mystery': ('Mystery', '/genre/mystery'), + 'romance': ('Romance', '/genre/romance'), + 'sci_fi': ('Sci-Fi', '/genre/sci_fi'), + 'short': ('Short', '/genre/short'), + 'sport': ('Sport', '/genre/sport'), + 'thriller': ('Thriller', '/genre/thriller'), + 'war': ('War', '/genre/war'), + 'western': ('Western', '/genre/western'), + } + } + + for y in range(2015, 1970, -1): + category_dict['year'][str(y)] = (str(y), '/year/%s/' % str(y)) + + regex_list = [] + + baseurl = "http://imdb.com" + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124' + \ + ' YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', baseurl), ('Accept-Encoding', 'gzip'), ('Accept-Language', 'ru,en;q=0.8')] + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 2 + + def isLabel(self): + return False + + def isPages(self): + return False + + def isSearchOption(self): + return True + + def isScrappable(self): + return True + + def get_contentList(self, category, subcategory=None, page=None): + contentList = [] + url = self.get_url(category, subcategory, page, self.baseurl) + + response = self.makeRequest(url, headers=self.headers) + + if None != response and 0 < len(response): + #print response + if category in ['top']: + contentList = self.topmode(response) + elif category == 'search': + contentList = self.searchmode(response) + else: #if category in ['genre']: + contentList = self.genremode(response) + #print str(contentList) + return contentList + + def searchmode(self, response): + contentList = [] + pars = HTMLParser.HTMLParser() + Soup = BeautifulSoup(response) + result = Soup.findAll('tr', {'class': ['findResult odd', 'findResult even']}) + num = 250 + for tr in result: + #main + info = {} + year = 0 + num = num - 1 + + title = pars.unescape(tr.findAll('a')[1].text) + tdtitle = tr.find('td', 'result_text') + #print str(tdtitle.text.encode('utf-8')) + originaltitle = tr.find('i') + if originaltitle: + originaltitle = originaltitle.text + try: + year = re.compile('\((\d\d\d\d)\)').findall(tdtitle.text)[0] + except: + try: + year = re.compile('(\d\d\d\d)').findall(tdtitle.text)[0] + except: + pass + info['tvshowtitle'] = title + img = self.biggerImg(tr.find('img').get('src')) + + contentList.append(( + int(int(self.sourceWeight) * (251 - int(num))), + originaltitle, title, int(year), img, info, + )) + #print result + return contentList + + def genremode(self, response): + contentList = [] + pars = HTMLParser.HTMLParser() + Soup = BeautifulSoup(response) + result = Soup.findAll('tr', {'class': ['odd detailed', 'even detailed']}) + for tr in result: + #main + info = {} + year = 0 + tdtitle = tr.find('td', 'title') + num = tr.find('td', 'number').text.rstrip('.') + originaltitle = None + title = pars.unescape(tdtitle.find('a').text) + try: + year = re.compile('\((\d\d\d\d)\)').findall(tdtitle.find('span', 'year_type').text)[0] + except: + try: + year = re.compile('(\d\d\d\d)').findall(tdtitle.find('span', 'year_type').text)[0] + except: + pass + info['tvshowtitle'] = title + img = self.biggerImg(tr.find('td', 'image').find('img').get('src')) + + #info + + info['code'] = tr.find('span', 'wlb_wrapper').get('data-tconst') + + contentList.append(( + int(int(self.sourceWeight) * (251 - int(num))), + originaltitle, title, int(year), img, info, + )) + #print result + return contentList + + def biggerImg(self, img): + if img and '._' in img: + img = img.split('._')[0] + '._V1_SY_CR1,0,,_AL_.jpg' + return img + + def topmode(self, response): + contentList = [] + Soup = BeautifulSoup(response) + result = Soup.findAll('tr', {'class': ['odd', 'even']}) + for tr in result: + #main + tdtitle = tr.find('td', 'titleColumn') + num = tdtitle.find('span', {'name': 'ir'}).text.rstrip('.') + originaltitle = None + title = tdtitle.find('a').text + year = tdtitle.find('span', {'name': 'rd'}).text.rstrip(')').lstrip('(') + tdposter = tr.find('td', 'posterColumn') + img = self.biggerImg(tdposter.find('img').get('src')) + + #info + info = {} + info['title'] = title + info['year'] = int(year) + info['code'] = tr.find('div', 'wlb_ribbon').get('data-tconst') + + contentList.append(( + int(int(self.sourceWeight) * (251 - int(num))), + originaltitle, title, int(year), img, info, + )) + #print result + return contentList + + +''' + - Video Values: + - genre : string (Comedy) + - year : integer (2009) + - episode : integer (4) + - season : integer (1) + - top250 : integer (192) + - rating : float (6.4) - range is 0..10 + - cast : list (Michal C. Hall) + - castandrole : list (Michael C. Hall|Dexter) + - director : string (Dagur Kari) + - mpaa : string (PG-13) + - plot : string (Long Description) + - plotoutline : string (Short Description) + - title : string (Big Fan) + - originaltitle : string (Big Fan) + - sorttitle : string (Big Fan) + - duration : string (3:18) + - studio : string (Warner Bros.) + - tagline : string (An awesome movie) - short description of movie + - writer : string (Robert D. Siegel) + - tvshowtitle : string (Heroes) + - premiered : string (2005-03-04) + - status : string (Continuing) - status of a TVshow + - code : string (tt0110293) - IMDb code + - aired : string (2008-12-07) + - credits : string (Andy Kaufman) - writing credits + - lastplayed : string (Y-m-d h:m:s = 2009-04-05 23:16:04) + - album : string (The Joshua Tree) + - artist : list (['U2']) + - votes : string (12345 votes) + - trailer : string (/home/user/trailer.avi) + - dateadded : string (Y-m-d h:m:s = 2009-04-05 23:16:04) + ''' \ No newline at end of file diff --git a/resources/contenters/IMDB.pyo b/resources/contenters/IMDB.pyo new file mode 100644 index 0000000000000000000000000000000000000000..8e5cc4eb31b1f69f04577bb6ce590746449b4c32 GIT binary patch literal 10241 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 CX#ffU literal 0 HcmV?d00001 diff --git a/resources/contenters/KinoPoisk.py b/resources/contenters/KinoPoisk.py new file mode 100644 index 0000000..a4b9be0 --- /dev/null +++ b/resources/contenters/KinoPoisk.py @@ -0,0 +1,310 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import re +import socket + +import Content +from BeautifulSoup import BeautifulSoup + + +class KinoPoisk(Content.Content): + category_dict = { + 'tvshows': ('TV Shows', '/top/serial/list/'), + 'cartoons': ('Cartoons', '/top/id_genre/14/'), + 'search': ('[B]Search[/B]', '/s/type/film/list/1/find/%s/'), + 'movies': ('Forieng Movies', '/s/type/film/list/1/m_act[country]/1/m_act[type]/film/'), + 'rus_movies': ('Russian Movies', '/s/type/film/list/1/m_act[country]/2/m_act[type]/film/'), + 'anime': ('Anime', '/s/type/film/list/1/order/rating/m_act[genre][0]/1750/',), + 'hot': ('Hot & New', '/popular/'), + 'top': ('Top 250 Movies', '/top/'), + 'genre': {'genre': 'by Genre', + 'russia': ('Russia & USSR', '/top/rus/list/'), + 'biography': ('Biography', '/s/type/film/list/1/m_act[genre][0]/22/'), + 'action': ('Action', '/top/id_genre/3/'), + 'thriller': ('Thriller', '/top/id_genre/4/'), + 'comedy': ('Comedy', '/top/id_genre/6/'), + 'drama': ('Drama', '/top/id_genre/8/'), + 'romance': ('Romance', '/top/id_genre/7/'), + 'horror': ('Horror', '/top/id_genre/1/'), + 'sci_fi': ('Sci-Fi', '/top/id_genre/2/'), + 'documentary': ('Documentary', '/top/id_genre/12/'), + 'cartoonseries': ('Cartoons Series', '/top/mult_serial/list/'), + 'cartoonshort': ('Cartoons Short', '/top/short_mult/list/'), + 'short': ('Short', '/top/short/list/'), + 'male': ('Male', '/top/sex/male/'), + 'female': ('Female', '/top/sex/female/'), + } + } + + for category in category_dict.keys(): + if isinstance(category_dict.get(category), dict): + for subcategory in category_dict.get(category).keys(): + if subcategory != category: + x = category_dict[category][subcategory] + if x[1].startswith('/s/type/film/list/'): + category_dict[category][subcategory] = (x[0], x[1] + 'perpage/25/', + {'page': x[1] + 'perpage/25/page/%d/', 'increase': 1, + 'second_page': 2}) + if not isinstance(category_dict.get(category), dict): + x = category_dict[category] + if x[1].startswith('/s/type/film/list/'): + category_dict[category] = ( + x[0], x[1] + 'perpage/25/', {'page': x[1] + 'perpage/25/page/%d/', 'increase': 1, 'second_page': 2}) + + category_dict['year'] = {'year': 'by Year', } + for y in range(2015, 1970, -1): + category_dict['year'][str(y)] = (str(y), '/s/type/film/list/1/m_act[year]/%s/' % str(y) + 'perpage/25/', + {'page': '/s/type/film/list/1/m_act[year]/%s/' % str(y) + 'perpage/25/page/%d/', + 'increase': 1, 'second_page': 2}) + + baseurl = "http://www.kinopoisk.ru" + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124' + \ + ' YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', baseurl), ('Accept-Encoding', 'gzip'), ('Accept-Language', 'ru,en;q=0.8')] + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 2 + + def isLabel(self): + return False + + def isPages(self): + return True + + def isSearchOption(self): + return True + + def isScrappable(self): + return True + + def get_contentList(self, category, subcategory=None, page=None): + socket.setdefaulttimeout(15) + contentList = [] + url = self.get_url(category, subcategory, page, self.baseurl) + + #print url + response = self.makeRequest(url, headers=self.headers) + + if None != response and 0 < len(response): + #print response + if category in ['hot']: + contentList = self.popmode(response) + elif url.startswith(self.baseurl + '/s/type/film/list/'): + contentList = self.infomode(response) + else: + contentList = self.topmode(response) + #print str(contentList) + return contentList + + def stripTtl(self, title): + bad_end = [u'\(ТВ\)', u'\(сериал\)', u'\(видео\)'] + for code in bad_end: + title = re.sub(u' ' + code + '$', '', title) + return title + + def popmode(self, response): + contentList = [] + Soup = BeautifulSoup(response) + result = Soup.find('div', 'stat').findAll('div', 'el') + #print str(result) + for tr in result: + #main + a = tr.findAll('a') + num = a[0].text + #print num + info = {} + year = 0 + img = '' + originaltitle = tr.find('i') + if originaltitle: + originaltitle = self.stripHtml(self.unescape(originaltitle.text)) + title = a[1].text + link = a[1].get('href') + if link: + id = re.compile('/film/(\d+)/').findall(link) + if id: + img = self.id2img(id[0]) + try: + title, year = re.compile('(.+?) \((\d\d\d\d)\)', re.DOTALL).findall(a[1].text)[0] + except: + pass + if not year: + try: + title, year = re.compile('(.+?) \(.*(\d\d\d\d)').findall(a[1].text)[0] + info['tvshowtitle'] = title + except: + pass + title = self.stripHtml(self.stripTtl(title)) + + #info + info['title'] = title + info['year'] = int(year) + + contentList.append(( + int(int(self.sourceWeight) * (201 - int(num))), + originaltitle, title, int(year), img, info, + )) + return contentList + + def topmode(self, response): + contentList = [] + Soup = BeautifulSoup(response) + result = Soup.find('table', {'cellpadding': '3'}).findAll('tr')[2:] + #print str(result) + for tr in result: + #main + td = tr.findAll('td') + year = 0 + info = {} + img = '' + title, originaltitle = None, None + num = td[0].text.rstrip('.') + originaltitle = tr.find('span', 'text-grey') + if originaltitle: + originaltitle = self.stripHtml(self.unescape(originaltitle.text)) + a_all = tr.find('a', {'class': 'all'}) + if a_all: + link = a_all.get('href') + if link: + id = re.compile('/film/(\d+)/').findall(link) + if id: + img = self.id2img(id[0]) + year = re.compile('(.+) \((\d\d\d\d)\)').findall(a_all.text) + if not year: + try: + title, year = re.compile('(.+) \(.*(\d\d\d\d)').findall(a_all.text)[0] + info['tvshowtitle'] = title + except: + title = a_all.text + else: + title, year = year[0] + title = self.stripHtml(self.stripTtl(title)) + + #info + if originaltitle and not title: + title = originaltitle + originaltitle = None + + if title: + info['title'] = title + info['year'] = int(year) + + contentList.append(( + int(int(self.sourceWeight) * (251 - int(num))), + originaltitle, title, int(year), img, info, + )) + return contentList + + def infomode(self, response): + contentList = [] + Soup = BeautifulSoup(response) + result = Soup.findAll('div', 'info') + #print str(result) + num = 0 + for div in result: + #main + info = {} + img = '' + name = div.find('p', 'name') + title = name.find('a').text + link = name.find('a').get('href') + if link: + id = re.compile('/film/(\d+)/').findall(link) + if id: + img = self.id2img(id[0]) + year = name.find('span', 'year') if name.find('span', 'year') else 0 + if year: + year=year.text + ysplit = year.split(' ') + if len(ysplit) > 1: year = ysplit[0] + title = self.stripHtml(self.unescape(title)) + tvshowtitle = re.compile(u'(.+?) \((.+?)\)$').findall(title) + if tvshowtitle and tvshowtitle[0][1] in [u'сериал']: + title = tvshowtitle[0][0] + info['tvshowtitle'] = title + num = num + 1 + originaltitle = div.find('span', 'gray') + if originaltitle: + originaltitle = re.match('(.+?), \d', originaltitle.text) + if originaltitle: + originaltitle = self.stripHtml(self.unescape(originaltitle.group(1))) + title = self.stripTtl(title) + + #info + info['title'] = title + info['year'] = int(year) + + contentList.append(( + int(int(self.sourceWeight) * (100 - int(num))), + originaltitle, title, int(year), img, info, + )) + return contentList + + + def id2img(self, id): + if id: + return "http://st.kp.yandex.net/images/film_iphone/iphone360_%s.jpg" % (str(id)) + else: + return '' + + +''' + - Video Values: + - genre : string (Comedy) + - year : integer (2009) + - episode : integer (4) + - season : integer (1) + - top250 : integer (192) + - tracknumber : integer (3) + - rating : float (6.4) - range is 0..10 + - watched : depreciated - use playcount instead + - playcount : integer (2) - number of times this item has been played + - overlay : integer (2) - range is 0..8. See GUIListItem.h for values + - cast : list (Michal C. Hall) + - castandrole : list (Michael C. Hall|Dexter) + - director : string (Dagur Kari) + - mpaa : string (PG-13) + - plot : string (Long Description) + - plotoutline : string (Short Description) + - title : string (Big Fan) + - originaltitle : string (Big Fan) + - sorttitle : string (Big Fan) + - duration : string (3:18) + - studio : string (Warner Bros.) + - tagline : string (An awesome movie) - short description of movie + - writer : string (Robert D. Siegel) + - tvshowtitle : string (Heroes) + - premiered : string (2005-03-04) + - status : string (Continuing) - status of a TVshow + - code : string (tt0110293) - IMDb code + - aired : string (2008-12-07) + - credits : string (Andy Kaufman) - writing credits + - lastplayed : string (Y-m-d h:m:s = 2009-04-05 23:16:04) + - album : string (The Joshua Tree) + - artist : list (['U2']) + - votes : string (12345 votes) + - trailer : string (/home/user/trailer.avi) + - dateadded : string (Y-m-d h:m:s = 2009-04-05 23:16:04) + ''' \ No newline at end of file diff --git a/resources/contenters/KinoPoisk.pyo b/resources/contenters/KinoPoisk.pyo new file mode 100644 index 0000000000000000000000000000000000000000..b3eda385447fdc0f999a0098b84bdd2916e2a937 GIT binary patch literal 10960 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 literal 0 HcmV?d00001 diff --git a/resources/contenters/RiperAM.py b/resources/contenters/RiperAM.py new file mode 100644 index 0000000..74cd062 --- /dev/null +++ b/resources/contenters/RiperAM.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import Content +from BeautifulSoup import BeautifulSoup + + +class RiperAM(Content.Content): + category_dict = { + #'movies':('Movies', '/popular/'), + #'tvshows':('TV Shows', '/top/serial/list/'), + #'cartoons':('Cartoons', '/top/id_genre/14/'), + #'anime':('Anime', '/search/title?count=100&genres=animation&keywords=anime&num_votes=1000,&explore=title_type&ref_=gnr_kw_an'), + 'hot': ('Hot & New', '/', {'page': '/portal.php?tp=%d', 'increase': 30, 'second_page': 30}), + #'top':('Top 250 Movies', '/top/'), + } + + baseurl = "http://www.riper.am" + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124' + \ + ' YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://www.riper.am/'), ('Accept-Encoding', 'gzip,deflate,sdch'), + ('Accept-Language', 'ru,en;q=0.8')] + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + def isLabel(self): + return True + + def isScrappable(self): + return False + + def isInfoLink(self): + return True + + def isPages(self): + return True + + def isSearchOption(self): + return False + + def get_contentList(self, category, subcategory=None, page=None): + contentList = [] + url = self.get_url(category, subcategory, page, self.baseurl) + + response = self.makeRequest(url, headers=self.headers) + + if None != response and 0 < len(response): + #print response + if category in ['hot']: + contentList = self.popmode(response) + #print str(contentList) + return contentList + + def popmode(self, response): + contentList = [] + Soup = BeautifulSoup(response) + result = Soup.findAll('table', 'postbody postbody_portal') + #print str(result) + num = 31 + bad_forum = [u'Безопасность', u'Книги и журналы', u'Action & Shooter', u'RPG/MMORPG'] + for tr in result: + #main + info = {} + forum = tr.find('div', {'style': 'height:20px;overflow:hidden;'}).find('a').text + if forum and forum in bad_forum: + continue + link = tr.find('div', {'style': 'width:200px;overflow:hidden;'}).find('a').get('href') + num = num - 1 + label = tr.find('strong').text + original_title = None + year = 0 + title = self.unescape(label) + img = tr.findAll('a')[0].find('img').get('src') + if img: + img = img.replace('.webp', '.jpg') + + #info + + info['label'] = label + info['link'] = link + info['title'] = title + info['year'] = int(year) + + contentList.append(( + int(int(self.sourceWeight) * (int(num))), + original_title, title, int(year), img, info, + )) + return contentList diff --git a/resources/contenters/RiperAM.pyo b/resources/contenters/RiperAM.pyo new file mode 100644 index 0000000000000000000000000000000000000000..f2e5a70ed34568c9652b937c9f63d5682b57f7cb GIT binary patch literal 4736 zcmdT{TW=f36`my}%AzgH@g=rvHyxmGN~6kBk{z|Rl?$!-B3Pn?C0$j53SzlCB*$9r zu4iU-2}q!+^H#s~wNFKVKoFp48=y$~7pPy-hyH-}JF`;kqE4H<*eIo)J#*&FnRB1B z#eYndzf_+!19tQ);{72W{Q-uMu`P@a3kxiA*cJf%7g+c_iJe~+YS97)0NCE)BEnZz?(NUSTqE0o5Z-#9+x zh~o@TlohAq8xmgeB&ChlA@Ko^d@|$FUf0sS)CkXY4LJ->67`Z4YW2VsitfoM;%&h* zEjn2=V|lKIyUb&Gq&gYQ4)8pq7dbI zKta0Y4v!Nv!!@K_>=~2Zs#f>*_S|lqxrypl5e*axy86CbmjA@BUU3lqW(va{;b%s| z!i^+L%>*!>Ooghgew}udDR=Pb-(wI+JBLYRlubTqvk7UpfNVpO*;k1zbby~=3rNH8 z1f!IjWMP?wC)vdgP~T(W6&7A)-7&U>ZD-lmI1A5FhHjNuc-{gNEWBWW6D)kw0$_2` z0$}ug`+tdjic~+v!pjyv#k@x4Es}H+!-K@|w|QOc8Pc_?-=Hx~l<^}s?WG@>^u24L z83Q);yF$`Fa{_~m10{Sd%t=hN2$DE#5rv`h(@Ts#NAKrGR%9;M@9Q$~kF-$l)Ve4o zx`pX#@-d>=ufFTf^2&yc!(>nMdXq1>bGP}%+Q!1o>%5kxk=PLJhtgEvz3~(G#saTA ze9&B7nc4~M>^NRqab|c@}I(?Qa1wSr>WnL z#0|{9ixM8Cfc3%ak)M)C>gBkTtjKt0;r~o}DxXrXQzrcEyNXV!^BN6*+KS!~z6yG4 z_BvmDK?BN1QjS90rtknjm$Bg(1N4}&fx`v`HYnPu!=8?@;kbo?L~+L|$cpT#;|x*a zL0@7!MW*(t88e_PVTtXacHqg9;sWS_;@JBHFhlGJUw_Jog?NJ}7? zN0*hgqCP6u6%yOhp@g?G6}3(48g>(PkY5&A`*`lr=@xlZW>(PI*&BpTr5r;cN>Qi8E3Xh#;K>v(2uA(1 zrT}10$+=RvRCud!%DGSosQ8gZNM7spKcHZf*Wokka`lV3Mh4 zG*Z|gFrKj|OEwZ-+>Ab;%>I2d1ehW&!?KOS)9eyOWxi?pnEgqL$02r~VZ$jKr-(Rv z`0%tPhG2FIg3Bb>8+IpnpS8TF*G5PfDYyYTO2?J+siBt zz!uO&wund=SOIB%2{h1rlG+ejK)7mZV3Q4SXjCr4 zUv*>^LXhqNeF;#SXwy!@1AYv&@?J>(0E-z>jD9=%)95dwuSS0xeSY}K=*!Vpho2n& z`tVtHl@@;o#22GKj=tdZ|L4P}hra^m^U+@qf0I#+)B^ehK*!bSB?-O&GOFa>`u*za z>Ka})_CvX=iCIt3$JDL)*>wMQf-i+mlrp-Oeni6$F}&*Pja^o7&!bg$!$* z-)hBvU$k0=(xKJD6_Q0XrBAQp%c2#^z<6g#VC(WZf^7OwNO(l*5krq8wQ=Q97Fk<8 zcaVi%O_%IZ-%jDEIfjx`9IuRF#NPz`FEx8F9S aEWg*HiS^N9?v?lH!%kCPm2mx?DgFxquC0Fn literal 0 HcmV?d00001 diff --git a/resources/images/black.png b/resources/images/black.png new file mode 100644 index 0000000000000000000000000000000000000000..1914264c08781d1f30ee0b8482bccf44586f2dc1 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?ju0VQumF+E%TuG2$FoVOh l8)-lem#2$k2*>s01R$Gz9%CSj!PC{xWt~$(697H@6ZHT9 literal 0 HcmV?d00001 diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml new file mode 100644 index 0000000..7fb9f30 --- /dev/null +++ b/resources/language/English/strings.xml @@ -0,0 +1,49 @@ + + + Interface Language + Lock Folders View Style + Off + Save Files To Folder + Use magnet-links + Keep downloaded files + Keep seeding of downloaded files + Upload speed limit MBits/sec (0 - unlimited) + Download speed limit MBits/sec (0 - unlimited) + Use only system libtorrent + Predownload and play next episode + Download metadata for Content Lists + Debug (Developer Mode) + Confluence (by slng) + Transperency (by slng) + Confluence (by DiMartino) + Confluence (by RussakHH) + Enable Search History + Python-Libtorrent (recommended) + Ace Stream (no magnets) + P2P Player + Rest Settings in Programms - AceStream Client + Search Timeout + Short (10s) + Normal (20s) + Long (30s) + Predownload subtitles from all folders + Keep seeding until Kodi restart + Interface + P2P Network + Save path + Call dialog + Default + Path + Create subdirectory for scrapper + Host + Port + URL + Login + Password + Torrent Client + Path replacement (remote only) + Close + Open Settings + Torrent Client Browser + + diff --git a/resources/language/Russian/strings.xml b/resources/language/Russian/strings.xml new file mode 100644 index 0000000..989334c --- /dev/null +++ b/resources/language/Russian/strings.xml @@ -0,0 +1,50 @@ + + + Язык интерфейса + Удерживать стиль отображения + Отключено + Сохранять файлы в директорию + Использовать магнет-ссылки + Хранить загруженные файлы + Оставаться на раздаче скачанных файлов + Ограничить скорость раздачи МБит/сек (0 - неограничено) + Ограничить скорость закачки МБит/сек (0 - неограничено) + Использовать только пользовательский libtorrent + Скачать и запустить следующий эпизод + Загружать мета-данные для Списков Медиа + Дебаг (Разработчик) + Confluence (от slng) + Transperency (от slng) + Confluence (от DiMartino) + Confluence (от RussakHH) + Включить Историю Поиска + Python-Libtorrent (предпочтительно) + Ace Stream (без магнит-ссылок) + P2P Проигрыватель + Остальные настройки в "Программы - AceStream Client" + Ожидание ответа сервера при Поиске + Короткое (10с) + Среднее (20с) + Долгое (30с) + Предзакачать и подключить субтитры + Сидировать до полного выключения Kodi + Интерфейс + P2P Сеть + Директория для сохранения файлов + Вызывать диалог + Задать по умолчанию + Путь к директории + Создавать поддиректорию для скрапера + Хост + Порт + URL + Логин + Пароль + Торрент-клиент + Замена пути (remote only) + Закрыть + Открыть Настройки + Браузер Торрент-клиента + + Статус Плагина + diff --git a/resources/pyxbmct/__init__.py b/resources/pyxbmct/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/resources/pyxbmct/__init__.pyo b/resources/pyxbmct/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..6d6416d122cc06f07ac0ce9a216bca64c9098766 GIT binary patch literal 182 zcmZ9GK?=e^3`IwDA%gel#vVXaEV>h1Slk7Mu?c0MoeYzy*b93BFJKC;4Ez`J`S3IU ztXJ>NzHZEKX1b3mSt!t$x|p16p)h|CtKMk~ccCOuVebP}F`iv^aAT)u3l~NY4v~XE x?1t8d^68Pd%$yR1ObHSR52+yyjIT%EWU$r;pRFz9n3vkI>lufR4$~*1GG9_wFXR9K literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/addonwindow.py b/resources/pyxbmct/addonwindow.py new file mode 100644 index 0000000..987ed1d --- /dev/null +++ b/resources/pyxbmct/addonwindow.py @@ -0,0 +1,774 @@ +# -*- coding: utf-8 -*- +# This is a "local" version of PyXBMCt to be used in standalone addons. +# +# PyXBMCt is a mini-framework for creating XBMC Python addons with arbitrary UI +# made of controls - decendants of xbmcgui.Control class. +# The framework uses image textures from XBMC Confluence skin. +# +# Licence: GPL v.3 http://www.gnu.org/licenses/gpl.html +# +## @package addonwindow +# PyXBMCt framework module + +import os +import xbmc, xbmcgui, xbmcaddon + +#_addon = xbmcaddon.Addon() +_images = os.path.join(os.path.dirname(__file__), 'textures', 'default') + + +# Text alighnment constants. Mixed variants are obtained by bit OR (|) +ALIGN_LEFT = 0 +ALIGN_RIGHT = 1 +ALIGN_CENTER_X = 2 +ALIGN_CENTER_Y = 4 +ALIGN_CENTER = 6 +ALIGN_TRUNCATED = 8 +ALIGN_JUSTIFY = 10 + +# XBMC key action codes. +# More codes at https://github.com/xbmc/xbmc/blob/master/xbmc/guilib/Key.h +## ESC action +ACTION_PREVIOUS_MENU = 10 +## Backspace action +ACTION_NAV_BACK = 92 +## Left arrow key +ACTION_MOVE_LEFT = 1 +## Right arrow key +ACTION_MOVE_RIGHT = 2 +## Up arrow key +ACTION_MOVE_UP = 3 +## Down arrow key +ACTION_MOVE_DOWN = 4 +## Mouse wheel up +ACTION_MOUSE_WHEEL_UP = 104 +## Mouse wheel down +ACTION_MOUSE_WHEEL_DOWN = 105 +## Mouse drag +ACTION_MOUSE_DRAG = 106 +## Mouse move +ACTION_MOUSE_MOVE = 107 + + +def _set_textures(textures={}, kwargs={}): + """Set texture arguments for controls.""" + for texture in textures.keys(): + try: + kwargs[texture] + except KeyError: + kwargs[texture] = textures[texture] + + +class AddonWindowError(Exception): + """Custom exception.""" + pass + + +class Label(xbmcgui.ControlLabel): + """ControlLabel class. + + Parameters: + label: string or unicode - text string. + font: string - font used for label text. (e.g. 'font13') + textColor: hexstring - color of enabled label's label. (e.g. '0xFFFFFFFF') + disabledColor: hexstring - color of disabled label's label. (e.g. '0xFFFF3300') + alignment: integer - alignment of label - *Note, see xbfont.h + hasPath: bool - True=stores a path / False=no path. + angle: integer - angle of control. (+ rotates CCW, - rotates CW)" + + Note: + After you create the control, you need to add it to the window with placeControl(). + + Example: + self.label = Label('Status', angle=45) + """ + def __new__(cls, *args, **kwargs): + return super(Label, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) + + +class FadeLabel(xbmcgui.ControlFadeLabel): + """Control that scrolls label text. + + Parameters: + font: string - font used for label text. (e.g. 'font13') + textColor: hexstring - color of fadelabel's labels. (e.g. '0xFFFFFFFF') + _alignment: integer - alignment of label - *Note, see xbfont.h + + Note: + After you create the control, you need to add it to the window with placeControl(). + + Example: + self.fadelabel = FadeLabel(textColor='0xFFFFFFFF') + """ + def __new__(cls, *args, **kwargs): + return super(FadeLabel, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) + + +class TextBox(xbmcgui.ControlTextBox): + """ControlTextBox class. + + Parameters: + font: string - font used for text. (e.g. 'font13') + textColor: hexstring - color of textbox's text. (e.g. '0xFFFFFFFF') + + Note: + After you create the control, you need to add it to the window with placeControl(). + + Example: + self.textbox = TextBox(textColor='0xFFFFFFFF') + """ + def __new__(cls, *args, **kwargs): + return super(TextBox, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) + + +class Image(xbmcgui.ControlImage): + """ControlImage class. + + Parameters: + filename: string - image filename. + colorKey: hexString - (example, '0xFFFF3300') + aspectRatio: integer - (values 0 = stretch (default), 1 = scale up (crops), 2 = scale down (black bars) + colorDiffuse: hexString - (example, '0xC0FF0000' (red tint)). + + Note: + After you create the control, you need to add it to the window with placeControl(). + + Example: + self.image = Image('d:\images\picture.jpg', aspectRatio=2) + """ + def __new__(cls, *args, **kwargs): + return super(Image, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) + + +class Button(xbmcgui.ControlButton): + """ControlButton class. + + Parameters: + label: string or unicode - text string. + focusTexture: string - filename for focus texture. + noFocusTexture: string - filename for no focus texture. + textOffsetX: integer - x offset of label. + textOffsetY: integer - y offset of label. + alignment: integer - alignment of label - *Note, see xbfont.h + font: string - font used for label text. (e.g. 'font13') + textColor: hexstring - color of enabled button's label. (e.g. '0xFFFFFFFF') + disabledColor: hexstring - color of disabled button's label. (e.g. '0xFFFF3300') + angle: integer - angle of control. (+ rotates CCW, - rotates CW) + shadowColor: hexstring - color of button's label's shadow. (e.g. '0xFF000000') + focusedColor: hexstring - color of focused button's label. (e.g. '0xFF00FFFF') + + Note: + After you create the control, you need to add it to the window with placeControl(). + + Example: + self.button = Button('Status', font='font14') + """ + def __new__(cls, *args, **kwargs): + textures = {'focusTexture': os.path.join(_images, 'Button', 'KeyboardKey.png'), + 'noFocusTexture': os.path.join(_images, 'Button', 'KeyboardKeyNF.png')} + _set_textures(textures, kwargs) + try: + kwargs['alignment'] + except KeyError: + kwargs['alignment'] = ALIGN_CENTER + return super(Button, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) + + +class RadioButton(xbmcgui.ControlRadioButton): + """ControlRadioButton class. + + Parameters: + label: string or unicode - text string. + focusTexture: string - filename for focus texture. + noFocusTexture: string - filename for no focus texture. + textOffsetX: integer - x offset of label. + textOffsetY: integer - y offset of label. + _alignment: integer - alignment of label - *Note, see xbfont.h + font: string - font used for label text. (e.g. 'font13') + textColor: hexstring - color of enabled radio button's label. (e.g. '0xFFFFFFFF') + disabledColor: hexstring - color of disabled radio button's label. (e.g. '0xFFFF3300') + angle: integer - angle of control. (+ rotates CCW, - rotates CW) + shadowColor: hexstring - color of radio button's label's shadow. (e.g. '0xFF000000') + focusedColor: hexstring - color of focused radio button's label. (e.g. '0xFF00FFFF') + focusOnTexture: string - filename for radio focused/checked texture. + noFocusOnTexture: string - filename for radio not focused/checked texture. + focusOffTexture: string - filename for radio focused/unchecked texture. + noFocusOffTexture: string - filename for radio not focused/unchecked texture. + Note: To customize RadioButton all 4 abovementioned textures need to be provided. + + Note: + After you create the control, you need to add it to the window with placeControl(). + + Example: + self.radiobutton = RadioButton('Status', font='font14') + """ + def __new__(cls, *args, **kwargs): + if int(xbmc.getInfoLabel('System.BuildVersion')[:2]) >= 13: + textures = {'focusTexture': os.path.join(_images, 'RadioButton', 'MenuItemFO.png'), + 'noFocusTexture': os.path.join(_images, 'RadioButton', 'MenuItemNF.png'), + 'focusOnTexture': os.path.join(_images, 'RadioButton', 'radiobutton-focus.png'), + 'noFocusOnTexture': os.path.join(_images, 'RadioButton', 'radiobutton-focus.png'), + 'focusOffTexture': os.path.join(_images, 'RadioButton', 'radiobutton-nofocus.png'), + 'noFocusOffTexture': os.path.join(_images, 'RadioButton', 'radiobutton-nofocus.png')} + else: # This is for compatibility with Frodo and earlier versions. + textures = {'focusTexture': os.path.join(_images, 'RadioButton', 'MenuItemFO.png'), + 'noFocusTexture': os.path.join(_images, 'RadioButton', 'MenuItemNF.png'), + 'TextureRadioFocus': os.path.join(_images, 'RadioButton', 'radiobutton-focus.png'), + 'TextureRadioNoFocus': os.path.join(_images, 'RadioButton', 'radiobutton-nofocus.png')} + _set_textures(textures, kwargs) + return super(RadioButton, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) + + +class Edit(xbmcgui.ControlEdit): + """ + ControlEdit class. + + Edit(label[, font, textColor, disabledColor, alignment, focusTexture, noFocusTexture]) + + Parameters: + label : string or unicode - text string. + font : [opt] string - font used for label text. (e.g. 'font13') + textColor : [opt] hexstring - color of enabled label's label. (e.g. '0xFFFFFFFF') + disabledColor : [opt] hexstring - color of disabled label's label. (e.g. '0xFFFF3300') + _alignment : [opt] integer - alignment of label - *Note, see xbfont.h + focusTexture : [opt] string - filename for focus texture. + noFocusTexture : [opt] string - filename for no focus texture. + isPassword : [opt] bool - if true, mask text value. + + *Note, You can use the above as keywords for arguments and skip certain optional arguments. + Once you use a keyword, all following arguments require the keyword. + After you create the control, you need to add it to the window with palceControl(). + + example: + - self.edit = Edit('Status') + """ + def __new__(cls, *args, **kwargs): + textures = {'focusTexture': os.path.join(_images, 'Edit', 'button-focus.png'), + 'noFocusTexture': os.path.join(_images, 'Edit', 'black-back2.png')} + _set_textures(textures, kwargs) + return super(Edit, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) + + +class List(xbmcgui.ControlList): + """ControlList class. + + Parameters: + font: string - font used for items label. (e.g. 'font13') + textColor: hexstring - color of items label. (e.g. '0xFFFFFFFF') + buttonTexture: string - filename for no focus texture. + buttonFocusTexture: string - filename for focus texture. + selectedColor: integer - x offset of label. + _imageWidth: integer - width of items icon or thumbnail. + _imageHeight: integer - height of items icon or thumbnail. + _itemTextXOffset: integer - x offset of items label. + _itemTextYOffset: integer - y offset of items label. + _itemHeight: integer - height of items. + _space: integer - space between items. + _alignmentY: integer - Y-axis alignment of items label - *Note, see xbfont.h + + Note: + After you create the control, you need to add it to the window with placeControl(). + + Example: + self.cList = List('font14', space=5) + """ + def __new__(cls, *args, **kwargs): + textures = {'buttonTexture': os.path.join(_images, 'List', 'MenuItemNF.png'), + 'buttonFocusTexture': os.path.join(_images, 'List', 'MenuItemFO.png')} + _set_textures(textures, kwargs) + return super(List, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) + + +class Slider(xbmcgui.ControlSlider): + """ControlSlider class. + + Parameters: + textureback: string - image filename. + texture: string - image filename. + texturefocus: string - image filename. + + Note: + After you create the control, you need to add it to the window with placeControl(). + + Example: + self.slider = Slider() + """ + def __new__(cls, *args, **kwargs): + textures = {'textureback': os.path.join(_images, 'Slider', 'osd_slider_bg.png'), + 'texture': os.path.join(_images, 'Slider', 'osd_slider_nibNF.png'), + 'texturefocus': os.path.join(_images, 'Slider', 'osd_slider_nib.png')} + _set_textures(textures, kwargs) + return super(Slider, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs) + + +class _AbstractWindow(object): + + """ + Top-level control window. + + The control windows serves as a parent widget for other XBMC UI controls + much like Tkinter.Tk or PyQt QWidget class. + This is an abstract class which is not supposed to be instantiated directly + and will raise exeptions. + + This class is a basic "skeleton" for a control window. + """ + + def __init__(self): + """Constructor method.""" + self.actions_connected = [] + self.controls_connected = [] + + def setGeometry(self, width_, height_, rows_, columns_, pos_x=-1, pos_y=-1): + """ + Set width, height, Grid layout, and coordinates (optional) for a new control window. + + Parameters: + width_, height_: widgh and height of the created window. + rows_, columns_: rows and colums of the Grid layout to place controls on. + pos_x, pos_y (optional): coordinates of the top left corner of the window. + If pos_x and pos_y are not privided, the window will be placed + at the center of the screen. + Example: + self.setGeometry(400, 500, 5, 4) + """ + self.width = width_ + self.height = height_ + self.rows = rows_ + self.columns = columns_ + if pos_x > 0 and pos_y > 0: + self.x = pos_x + self.y = pos_y + else: + self.x = 640 - self.width/2 + self.y = 360 - self.height/2 + self.setGrid() + + def setGrid(self): + """ + Set window grid layout of rows * columns. + This is a helper method not to be called directly. + """ + self.grid_x = self.x + self.grid_y = self.y + self.tile_width = self.width/self.columns + self.tile_height = self.height/self.rows + + def placeControl(self, control, row, column, rowspan=1, columnspan=1, pad_x=5, pad_y=5): + """ + Place a control within the window grid layout. + + pad_x, pad_y: horisontal and vertical padding for control's + size and aspect adjustments. Negative values can be used + to make a control overlap with grid cells next to it, if necessary. + Raises AddonWindowError if a grid has not yet been set. + Example: + self.placeControl(self.label, 0, 1) + """ + try: + control_x = (self.grid_x + self.tile_width * column) + pad_x + control_y = (self.grid_y + self.tile_height * row) + pad_y + control_width = self.tile_width * columnspan - 2 * pad_x + control_height = self.tile_height * rowspan - 2 * pad_y + except AttributeError: + raise AddonWindowError('Window geometry is not defined! Call setGeometry first.') + control.setPosition(control_x, control_y) + control.setWidth(control_width) + control.setHeight(control_height) + self.addControl(control) + self.setAnimation(control) + + def getX(self): + """Get X coordinate of the top-left corner of the window.""" + try: + return self.x + except AttributeError: + raise AddonWindowError('Window geometry is not defined! Call setGeometry first.') + + def getY(self): + """Get Y coordinate of the top-left corner of the window.""" + try: + return self.y + except AttributeError: + raise AddonWindowError('Window geometry is not defined! Call setGeometry first.') + + def getWindowWidth(self): + """Get window width.""" + try: + return self.width + except AttributeError: + raise AddonWindowError('Window geometry is not defined! Call setGeometry first.') + + def getWindowHeight(self): + """Get window height.""" + try: + return self.height + except AttributeError: + raise AddonWindowError('Window geometry is not defined! Call setGeometry first.') + + def getRows(self): + """ + Get grid rows count. + Raises AddonWindowError if a grid has not yet been set. + """ + try: + return self.rows + except AttributeError: + raise AddonWindowError('Grid layot is not set! Call setGeometry first.') + + def getColumns(self): + """ + Get grid columns count. + Raises AddonWindowError if a grid has not yet been set. + """ + try: + return self.columns + except AttributeError: + raise AddonWindowError('Grid layout is not set! Call setGeometry first.') + + def connect(self, event, function): + """ + Connect an event to a function. + + An event can be an inctance of a Control object or an integer key action code. + Several basic key action codes are provided by PyXBMCT. More action codes can be found at + https://github.com/xbmc/xbmc/blob/master/xbmc/guilib/Key.h + + You can connect the following Controls: Button, RadioButton and List. Other Controls do not + generate any control events when activated so their connections won't work. + To catch Slider events you need to connect the following key actions: + ACTION_MOVE_LEFT, ACTION_MOVE_RIGHT and ACTION_MOUSE_DRAG, and do a check + whether the Slider is focused. + + "function" parameter is a function or a method to be executed. Note that you must provide + a function object [without brackets ()], not a function call! + lambda can be used as a function to call another function or method with parameters. + + Examples: + self.connect(self.exit_button, self.close) + or + self.connect(ACTION_NAV_BACK, self.close) + """ + try: + self.disconnect(event) + except AddonWindowError: + if type(event) == int: + self.actions_connected.append([event, function]) + else: + self.controls_connected.append([event, function]) + + def connectEventList(self, events, function): + """ + Connect a list of controls/action codes to a function. + See connect docstring for more info. + """ + [self.connect(event, function) for event in events] + + def disconnect(self, event): + """ + Disconnect an event from a function. + + An event can be an inctance of a Control object or an integer key action code + which has previously been connected to a function or a method. + Raises AddonWindowError if an event is not connected to any function. + + Examples: + self.disconnect(self.exit_button) + or + self.disconnect(ACTION_NAV_BACK) + """ + if type(event) == int: + event_list = self.actions_connected + else: + event_list = self.controls_connected + for index in range(len(event_list)): + if event == event_list[index][0]: + event_list.pop(index) + break + else: + raise AddonWindowError('The action or control %s is not connected!' % event) + + def disconnectEventList(self, events): + """ + Disconnect a list of controls/action codes from functions. + See disconnect docstring for more info. + Raises AddonWindowError if at least one event in the list + is not connected to any function. + """ + [self.disconnect(event) for event in events] + + def executeConnected(self, event, connected_list): + """ + Execute a connected event (an action or a control). + This is a helper method not to be called directly. + """ + for item in connected_list: + if event == item[0]: + item[1]() + break + + def setAnimation(self, control): + """ + This method is called to set animation properties for all controls + added to the current addon window instance - both built-in controls + (window background, title bar etc.) and controls added with placeControl(). + It receives a control instance as the 2nd positional argument (besides self). + By default the method does nothing, i.e. no animation is set for controls. + To add animation you need to re-implement this menthod in your child class. + + E.g: + def setAnimation(self, control): + control.setAnimations([('WindowOpen', 'effect=fade start=0 end=100 time=1000',), + ('WindowClose', 'effect=fade start=100 end=0 time=1000',)]) + """ + pass + + +class _AddonWindow(_AbstractWindow): + + """ + Top-level control window. + + The control windows serves as a parent widget for other XBMC UI controls + much like Tkinter.Tk or PyQt QWidget class. + This is an abstract class which is not supposed to be instantiated directly + and will raise exeptions. It is designed to be implemented in a grand-child class + with the second inheritance from xbmcgui.Window or xbmcgui.WindowDialog + in a direct child class. + + This class provides a control window with a background and a header + similar to top-level widgets of desktop UI frameworks. + """ + + def __init__(self, title=''): + """Constructor method.""" + super(_AddonWindow, self).__init__() + self.setFrame(title) + + def setFrame(self, title): + """ + Define paths to images for window background and title background textures, + and set control position adjustment constants used in setGrid. + This is a helper method not to be called directly. + """ + # Window background image + self.background_img = os.path.join(_images, 'AddonWindow', 'ContentPanel.png') + # Background for a window header + self.title_background_img = os.path.join(_images, 'AddonWindow', 'dialogheader.png') + # Horisontal adjustment for a header background if the main background has transparent edges. + self.X_MARGIN = 5 + # Vertical adjustment for a header background if the main background has transparent edges + self.Y_MARGIN = 5 + # Header position adjustment if the main backround has visible borders. + self.Y_SHIFT = 4 + # The height of a window header (for the title background and the title label). + self.HEADER_HEIGHT = 35 + self.background = xbmcgui.ControlImage(-10, -10, 1, 1, self.background_img) + self.addControl(self.background) + self.setAnimation(self.background) + self.title_background = xbmcgui.ControlImage(-10, -10, 1, 1, self.title_background_img) + self.addControl(self.title_background) + self.setAnimation(self.title_background) + self.title_bar = xbmcgui.ControlLabel(-10, -10, 1, 1, title, alignment=ALIGN_CENTER, textColor='0xFFFFA500', + font='font13_title') + self.addControl(self.title_bar) + self.setAnimation(self.title_bar) + self.window_close_button = xbmcgui.ControlButton(-100, -100, 60, 30, '', + focusTexture=os.path.join(_images, 'AddonWindow', 'DialogCloseButton-focus.png'), + noFocusTexture=os.path.join(_images, 'AddonWindow', 'DialogCloseButton.png')) + self.addControl(self.window_close_button) + self.setAnimation(self.window_close_button) + + def setGeometry(self, width_, height_, rows_, columns_, pos_x=-1, pos_y=-1, padding=5): + """ + Set width, height, Grid layout, and coordinates (optional) for a new control window. + + Parameters: + width_, height_: widgh and height of the created window. + rows_, columns_: rows and colums of the Grid layout to place controls on. + pos_x, pos_y (optional): coordinates of the top left corner of the window. + If pos_x and pos_y are not privided, the window will be placed + at the center of the screen. + padding (optional): padding between outer edges of the window and + controls placed on it. + Example: + self.setGeometry(400, 500, 5, 4) + """ + self.win_padding = padding + super(_AddonWindow, self).setGeometry(width_, height_, rows_, columns_, pos_x, pos_y) + self.background.setPosition(self.x, self.y) + self.background.setWidth(self.width) + self.background.setHeight(self.height) + self.title_background.setPosition(self.x + self.X_MARGIN, self.y + self.Y_MARGIN + self.Y_SHIFT) + self.title_background.setWidth(self.width - 2 * self.X_MARGIN) + self.title_background.setHeight(self.HEADER_HEIGHT) + self.title_bar.setPosition(self.x + self.X_MARGIN, self.y + self.Y_MARGIN + self.Y_SHIFT) + self.title_bar.setWidth(self.width - 2 * self.X_MARGIN) + self.title_bar.setHeight(self.HEADER_HEIGHT) + self.window_close_button.setPosition(self.x + self.width - 70, self.y + self.Y_MARGIN + self.Y_SHIFT) + + def setGrid(self): + """ + Set window grid layout of rows * columns. + This is a helper method not to be called directly. + """ + self.grid_x = self.x + self.X_MARGIN + self.win_padding + self.grid_y = self.y + self.Y_MARGIN + self.Y_SHIFT + self.HEADER_HEIGHT + self.win_padding + self.tile_width = (self.width - 2 * (self.X_MARGIN + self.win_padding))/self.columns + self.tile_height = ( + self.height - self.HEADER_HEIGHT - self.Y_SHIFT - 2 * (self.Y_MARGIN + self.win_padding))/self.rows + + def setWindowTitle(self, title=''): + """ + Set window title. + This method must be called AFTER (!!!) setGeometry(), + otherwise there is some werid bug with all skin text labels set to the 'title' text. + Example: + self.setWindowTitle('My Cool Addon') + """ + self.title_bar.setLabel(title) + + def getWindowTitle(self): + """Get window title.""" + return self.title_bar.getLabel() + +class _FullWindow(xbmcgui.Window): + + """An abstract class to define window event processing.""" + + def onAction(self, action): + """ + Catch button actions. + Note that, despite being compared to an integer, + action is an instance of xbmcgui.Action class. + """ + if action == ACTION_PREVIOUS_MENU: + self.close() + else: + self.executeConnected(action, self.actions_connected) + + def onControl(self, control): + """ + Catch activated controls. + Control is an instance of xbmcgui.Control class. + """ + if control == self.window_close_button: + self.close() + else: + self.executeConnected(control, self.controls_connected) + + +class _DialogWindow(xbmcgui.WindowDialog): + + """An abstract class to define window event processing.""" + + def onAction(self, action): + """ + Catch button actions. + Note that, despite being compared to an integer, + action is an instance of xbmcgui.Action class. + """ + if action == ACTION_PREVIOUS_MENU: + self.close() + else: + self.executeConnected(action, self.actions_connected) + + def onControl(self, control): + """ + Catch activated controls. + Control is an instance of xbmcgui.Control class. + """ + if control == self.window_close_button: + self.close() + else: + self.executeConnected(control, self.controls_connected) + + +class BlankFullWindow(_FullWindow, _AbstractWindow): + """ + Addon UI container with a solid background. + This is a blank window with a black background and without any elements whatsoever. + The decoration and layout are completely up to an addon developer. + The window controls can hide under video or music visualization. + Window ID can be passed on class instantiation an agrument + but __init__ must have the 2nd fake argument, e.g: + + def __init__(self, *args) + + Minimal example: + + addon = MyAddon('My Cool Addon') + addon.setGeometry(400, 300, 4, 3) + addon.doModal() + """ + pass + + +class BlankDialogWindow(_DialogWindow, _AbstractWindow): + """ + Addon UI container with a transparent background. + This is a blank window with a transparent background and without any elements whatsoever. + The decoration and layout are completely up to an addon developer. + The window controls are always displayed over video or music visualization. + Minimal example: + + addon = MyAddon('My Cool Addon') + addon.setGeometry(400, 300, 4, 3) + addon.doModal() + """ + pass + +class AddonFullWindow(_FullWindow, _AddonWindow): + + """ + Addon UI container with a solid background. + Control window is displayed on top of the main background image - self.main_bg. + Video and music visualization are displayed unhindered. + Window ID can be passed on class instantiation as the 2nd positional agrument + but __init__ must have the 3rd fake argument, e.g: + + def __init__(self, title='', *args) + + Minimal example: + + addon = MyAddon('My Cool Addon') + addon.setGeometry(400, 300, 4, 3) + addon.doModal() + """ + + def __new__(cls, title='', *args, **kwargs): + return super(AddonFullWindow, cls).__new__(cls, *args, **kwargs) + + def setFrame(self, title): + """ + Set the image for for the fullscreen background. + """ + # Image for the fullscreen background. + self.main_bg_img = os.path.join(_images, 'AddonWindow', 'SKINDEFAULT.jpg') + # Fullscreen background image control. + self.main_bg = xbmcgui.ControlImage(1, 1, 1280, 720, self.main_bg_img) + self.addControl(self.main_bg) + super(AddonFullWindow, self).setFrame(title) + + def setBackground(self, image=''): + """ + Set the main bacground to an image file. + image: path to an image file as str. + Example: + self.setBackground('d:\images\bacground.png') + """ + self.main_bg.setImage(image) + + +class AddonDialogWindow(_DialogWindow, _AddonWindow): + """ + Addon UI container with a transparent background. + Control window is displayed on top of XBMC UI, + including video an music visualization! + Minimal example: + + addon = MyAddon('My Cool Addon') + addon.setGeometry(400, 300, 4, 3) + addon.doModal() + """ + pass diff --git a/resources/pyxbmct/addonwindow.pyo b/resources/pyxbmct/addonwindow.pyo new file mode 100644 index 0000000000000000000000000000000000000000..b986b5b37b6189da7fe3641572102cd7a8cfe2ea GIT binary patch literal 36263 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 PRR&(e?}>p!0~h}v0QSpH literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/AddonWindow/ContentPanel.png b/resources/pyxbmct/textures/default/AddonWindow/ContentPanel.png new file mode 100644 index 0000000000000000000000000000000000000000..eb022d62fba3d83f3ecef3aac6c071b20884fb72 GIT binary patch literal 53334 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Ì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 literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton-focus.png b/resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..fdde65cdf987a59197b160ad14092b51da5fd4e2 GIT binary patch literal 5216 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 IM6N<$f_r^~X8-^I literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/AddonWindow/SKINDEFAULT.jpg b/resources/pyxbmct/textures/default/AddonWindow/SKINDEFAULT.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d5b572bd46fc88c8ed48a5c15cb5351b8500e1d GIT binary patch literal 125107 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�(*r?3uhj$FK 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Îi9dQEz;MWq_bJxCPbGFUhGPfzo5ApSi0Ct%r^* zVi)mJx0Z~a{F&BP>4Cohw?Y@Y2HctL=ncQQ6El83;@=_n$RCgz2a_jW<^Y1ut&40n z!GKXTRtfSvc4X-`#LLj)){rl7-D7}0Nt^&9G?_r}QxX?Bm z1!UE@VuPS%kkD&$MPiuJ11qL(21{clY2bYqWm)wyV0aww1wH*aCmC=3Lwk?j zT^jeX8#Re0tHB)e83E7KPU=s{B_2>XCFjT6rd(2a3I!NR?JO!9`4z9XI5nbXOE=kW@T!PAaqa zD-4#2Q^OWg3jT!SMHV(I5~q#%!AP(8iN(AAg<-QR5~f=*qwEN*ypI&p{{Ui=Br*Gp zqlbeelPMJPJc(KnTp`l1rFJ}G%1BE=L&))1YbJ`r!0}!(Jc(Kg6_Mi~8-*+sj7mtI zp&0HwV))=_$9z|T;}6UI#*sTh5y;Vo;Zd#fQZd|lidKYGuTj)#S)&g&QZdHJc@njw z8eCVYXf5(AVyi!?Sj8>TSrWAHO-1=Hrmu2PkB&;l>nNr!Y?jklqpMAv+H1*uC;sK} za^>aMr7J}@ zmefvKWbP`=oQ@PDjt-}%R!zeUor`0WmBaqTYjkwDQ8x|A*tE-Nc8#Yw=*dq`P7+&6 zE|^-NB))=Z{@+FLzsCJvNR&FLuBT7V()*uB(tKax9~P?AS{kqXv;3_5?Jq#3MRDZH zc)nh5FG0h}_p$r8^8U}$l4dPEqxv;d(EOb-xdP{XbQyro3IR zvpw#Q@%LS&QP$DX*Ic^oWu|!7m&wre7=9Zv{+IhbxQ2;nemVGdylbfGH8kIpl#)9% zzB}+9p?~WwKS?I2earK3WrsE&i;n*8cDF!L-0zOR!F4~EuG9Yj`NvWCPd#>>fBZyk zC-E%zjs8zHY32ACX<9uWnebgC`?}pa{{ZGM{&o0&L4WH;b^es(D^5)B;lkhG;f|k$ zldq@vZoal-r!4Z-9;d>(r|}5)d_Uouv(x_o^J>Lu!|u;gJua(@Q|mN3c~;sQZ&m%> zA$I4_pDb@}n!nHbPcJK?_y(i5sU-zhhFhrkkHLNoe>YWYYX1PHKbifJZEt{dopN#N zI^T%vD%v`cf`3GT55V7tn(g_0YL?yKH9zPla$Ve6dFIP4eI)+>0NL}O6a0VF>!+vC z=`NZN{O>Za=zPAuuCGz4DeCG=Qg1F&cF)o^fAG)Yddm85iR);~i1iw2uh8+nCI0}1 ze-`NBEl!>qe-P4N=INzx{{ZEA8yw@*>H407kM8ka+xhtZxBI>^MBTp3>(%LXG&Lm+ zNIf~N<0VZJaN>&3FIr{vL$`DX8eWCmC{EqbbUnzpXJd91?esE^1=0J92yk0ZPa9F8 z442b|teZ&XlWFPabEij7J6O7Kx3&(=4J&_8S>er=ZqAQN*2k;U=;11}o1)S^o|i}T zI5|DLxF~6K*WkQ5d~au7j*rynhJ|{ZIajU5^OsLaU|DEVyk}$6`3|tMEc7XD_b1%w zk>ty#S;EQ9siT)?u{{hoxyz}eN#Xbmt*48rq>^|zI*mGSIX%5?8e3C|UD`5}|h!OtbRH_2)8h{}jpRw+%@_#r1&R&RbtN$zu3Mlm@% zvQsGcqEg(2uAEbovTS<$2u7`nZ<5~+_-?<&I)$U58GXaD(*FPp)1>uU{{RzHmUcQr7^YZ>Z1nJ)XXyR@7O6eSMEpq4+(==JhuiJ+#*HFYw=oE}jdh>LYWP@jk!MWQ`qVHNhg0S z^Ys4z0NKaM&2Qbq`LmjgJ2cYMg4!`9#^bcAvLeaqZO=RxeYh3c++X07w>w6LNqil%uPr^!1{(BkQ{MJf6SdQqhCe(SI{X^^dvf;kjIYOJAl+8p|?=`j1EA zpAJb&sL)@Lzt0c!{{XS&>FUcyYEXG!sq_5YU7O(QCh`9O-!bWN<=yx2@qhQ*=e6|R zN-|AKJU`gw-Lva{BhW|UdNS%XV_ig7=8b3{uRUgm9s zq|Subs9qH;v(>}=tbas5)kyJZ0jJ;_At|6@s=%l}urCxLnXzjIyfE&7Ft6?arj>%X z&4?wV2Y>>aFs)_eVQ0G%`Wfu30pW}K5;I;b7U_lTz_wzGa1G4)0#vJ!eoQ0BR#4gC zotp3&Z1V$KS!<_#(a)3@s}EnX&VXKXWgE6SerzkBuqCY&ohHboYa*NC4qq|u_c398ZQX~nQh>|};8G#f1iM-RYP+$mc0^fs6%!zkAw zr{HM-v0O7GI!dzW3L%g-1Eq(MDES#IQ1S-BY!s@E5U;q>7i^F#*l#9E?fnB_7PmEI zWgc0Q@+OS|Al3ug6oViFjaXF%y=Z8qW9SPS8oX{4uiVNbNE;Q51~~OHPJ)o~Xq#%Q zt%izO^XO%;W6mh7D5S<%S=>~tYNYbUD5t*xSrsbaZR|3XRI3S%7hF(&uRC+8&^LOxG3k!(m9nJ}eGbC|-nz*V+rt;S3A3@EC|QmBD1BW^K4 zszWYl&)6wcP$5DphF&PiU5=Ipg{>7s$2UT#V{8twA0;6ur9~i`VkcXakLpq-O&l_d zpF(lGj~rbTiBrbfW5;12ilnQ-NR>QCTkm2=2z0#eRwSe;qLBRwMz%#DzwE3^sSgEU z()yB1b>yUc6^U4Q;k*@&SAuIh4!t%l5vsvbW5p_D;<+mpQYB3k_9-0Lk$9$2Dk~DE zio&ttyS(3)EO1gZQYB9a*NbDNm*>bLpOjK4q=?!vTkwZVAJ`F9?p7-WBu3K3UD;U2 z>}bZFZc#7Lq={Ns!pDm4ythGyb}JZh_Zmd*MTBXUjDDevYWXP`_#Q-VO&Hzy@>VNv zCWdiVJQsoFLes@wYb7Ivjzxrh3c-7nkqcDQ`xlN89XO_*#iEMDD5YpUzD7#yWf9_A z(p{nKvWhjxdqxiA`#|BzWgIgoSkb$Y?Q{npV$EfPvxFTFay3_A?ZIBaIR60IhE$wM zxEI-rS76cRPG<^Uf;}^($8;lwHZGN!IVGopa)ljk7MUqR?466_la;`fp@wxz1e|D% z#e8ydxCrA%Ord1lNm#tgXoY)@<46iP7f0B|Sn7pJ@;Vw8nLG^?ENFPEOk{;d&{R@k zif66(bMW_3_=m0e8b6W|{Mx#*+7a^q0I+nACnh{t-1EATAA@`ks`%enx_*;M>P!66 zc#Kz;_($l!2K*!N&w$g^jD987{{XIQ{5U^F&$~PNE}y6PPe~q+po7!UPxH_G+ONxJ zPL7v^{f6}T?x(Nh>Mw3Lw;$_&U+w(VmaeZ;{{X2r(yz<1UqRv1_N3CH`g#xdX$3~rR;El-kZ3tI+`ZoUn#?am9zyAQ___q!YxvS;%T{l&SQ^)ZzzxDY!o}Yjyc{)27 zsv~LH+*n6*qfR!3Q7xw&2T5gB(uU`6O$C2bpGH1T{*o5{qGdcd^2^KA=(M&yo|{V2 z@_GFZouqr6E|KMO*QwL5)9G!4rW#a+(bB>?wDi_?JnXC7;`HQt6rLQNWmuDs+lFlf z1%4o%D&2}8H9$dHnAB*Hk_PF~3IdV?217~d7~PHJ97uQ9CL1{>UB1u%{m60ff$?F_ z{oMC;o#$Od{B~*wr3!%AF9=B3^ZrG&13-YIn5i*~^z57+CkLQcTwdUC-7`Sn)4Syb zP_@h0B#hV=PUIp>CiM2her{*&pR8_mOG$}NY@V+SIuc{6G!IUM?_MN>R zc8UjCds(h6Ju2DdL$3a;ib&9sfkQfv+oPm_jK9+26b|iYQZ@dD96ZgWpqCJ^XBOBq zReGnJhv$tgf0qiH@BN>O3@h*lb{go~kY!7B;#0RS=Yf9cl> zp_+-qXw0-0-q_x+w;K?Bb zhdXJRDVG8Rj#f!X$*E-B;c`X3CGA;0?wrp7rKrV3)%(6?Mg%^FJN@8iN<5PHlB%8D z&BBX+IO1Hm@PA~;_(MNyq_t%ui?p$c`8=YkZ~5}Bs`5%x1>7eB{xdFuO?<=BH4JLi z(rWV1-sEqB<>Nga))x)~ZuOM$67tH6S)&llxMt_;jS0;aU#!yZ>tKD2kwh+mO`O+8 zU+f7+ru>j9A`9;8si_Ng1YK9EfD6+6ji2xMX~jos~MSEJc&kw&ezb5Ljpu7I?tJ?H#7@i6G^+O^8JPDOak6*w6)mbGRwln7E+!n(#N1u@l4Zn^Q zELh^6n?eU@#Lk&JtN2xaag(22GbYIhE$t?Ro9sPVeI^u!xj|jajIeyGYz?Y)=KX0; z9;6%?%@?kon#?-!E9+I3aG2;OK_jhusz@8|$nUzDy^r zSOz3yed~T91^N?iwHU`y`D1eLEK!M$K4)aKW61e$SfP6U*w*1mYecYCV4JO~V;$2E zhy?#=W^0ZChuUpdtpG8oalfGeMZekr{^b>w>fwBiVVGEtVCTcxJ+S?aEwg(_LI==q zA3PE{%lo_u9t;^@I=wQ5y=M(M^C|ikeNJxdJ-)rjA56BG#25)qkuR=d8@O@sOF_KZf zHFS30r$^aH^e1@((?kB1D&&2B{UW}5W`1@R32ZCc#pLggz5eFtv_7vb9Xd61{j_133m=D0Y7L;FV ztN5DSqAE~Cz0`Swd;>+Ae~PXki9S3(<$DTAqiPT}`JrTW-GjRO)N4>Cwq~!!J~sMI zxtQUB-Yk-fBdMC-etqdGGIUY3?0vrem};grjZ3zc^)W_os@&}8NAMWl*2Po|_d;q2x+A>y(TatHxR`whFP8Y-Y z#}GYZ)Q@;Bz(}dT6rEozxpqd?L!$UK6G6@=ko0je_J^;!q>b$@1KI<0|GH-PaM45R zWWoQDI7W76ZG|!I{wBsNng=owCt1iJvYJ{G^7|G_v!D6(FNU0Kp@8sTiPwO zi*oYlWzCFu`vnjq)4}Y7c9Bnk((;s}4qH}c%E0a(1jIh&fZYQ{FkM~V>vHRQMq{jPRnSHbxBOPS?cipNnWD@ zYv-N@PuLQ6BCjC4;Ucre9};EXXHhDB_@sk<6jMKj!qy#D?Rpsh*PaSMhj7aeP+A>d zgeDqU0-umG#ebCl)$tOu6(7$ZEhMxQbW_wRY#0&2BzaWlYgaGy&`z$1T|38Yw$AGS zi~ZxdR${IdQAr^BbbQE|ab7)6Hpg9V9>CV>2_jKEIi5KG@V{c5r=}=eFdSLbp=A*h z$S==&%C0+F??3Ob?X?fsiI;-FiVu*D^eU78ZiN5&9#VMPxpEpjg37o#?=`4dxT|X_ z>dGKpckw-ugL+;&NAH0{f2?VZiL#U|TQsdmNl$KhR<;sz5>Iv!o5A2B&WiwZE11al z3wp?Vd~WCrZJXLXtaYEsDYD<1n0TZtllcyogT9JCBhhB+(B5(^ef!rxRXfoc)cki4Oj+)gO)?ay5HbYE$vpw7p1DOi8MxyQEF0s7 z1`edr3jta3?@nZe3%$N$ykGR>bs9$zuC^PqC&6F*&T9sx&!hHnAGc)ZhEf7dp*h7T zv)J_3-1DTaK`Fq{IFs{5-L-5J?nl&dj*SN)8yU2AYIOYg1dVuVpO`Vgo!

      -cd^| z?eS_CJYO!-P}EvH;>?A0Y;90P7L4J%Lg1PL6-Mj9_i;1BThjP~h1^!_J%6Ton2txf z>q0GFZe;z`ls@TV;5rmkx zc*+IKxnRE4I0?sPKMq2s+(<;TXNml5Eg^^=46~znvAucr@5aP1rhRVSAk=&7g`sa# z+$!$#&1#8`kRKzir07&$8lDQzpuyq}b?4uwBXRw(Q)?9?HiOP1UJR^_Yd(4zoBA zA4gc_#97drrr4Tz3Bd4|Ap+JitsL+ho<_w@T0X-LfUg!hqxTt>f>RGNA0+*|F*Px~ zkS%vC2QSKYEdcc!=Jjl!hpe@$%jwTdl*`JE{+PBm0nJO# zj-e=G^?-H?TwPb2inayY5d$v~iVWuFC^s`;OiZ}8VfTrdI|c2UnKYF*%bBFZgtG-; zJWYpH19oy-=kUF7p|1_BAYA1u3z(ApZ`s5Q7AFce)4!$*6qTxAVctfF`#4eVo)V-w8Wc9M3Wo)XbeYOYO}CVC4!Gg z3NZE#gOEw9l{6WzV0H!`AtUa8H^vSApfn}%ef+YE(i;0o+b15&V1zL5rBvr;QZ%7a zfGu57!+UW?Qd1b`-9zU%F6(->Sxi{w116|xowH$n>84rqqxjJ z9#=+W#TP6(P5qbpdNKXW{vy&MWoDMDzJVgJdSm3k%FiPU8SVdK!mUNP^R?vc;RY~W z|AxQumUfYSv&imr(AAf%(FyWB<%98DWCcYuvg<1QYvosCl$bDUO>^GXc^;989=e}h zqH;dZ4=o%$|Mc7O=&mc>*3jDLBGWLVV|+0Y6>pLI1X;4e^XvPPb;xtn0?zyqb(MD6 zgM~0$-CwTz{oew7$zE4hi2*w30H)XmYpxi_o||c+%C8@WlQFd`GH^?{70;6wrp%&s zg7df%rhO>VZ8ZYJl}{EXpQytPAAWkkd|S{lk4s^iLltcRD;{F5Q@pFwL)QJws#B3h z2Muo(cU$G-1byP~$cgi#^$>+&t-*I+YA2QL+_g3yV7h(x9d-W(zY9z*-2N&;{a7@9 zO=D&YBs?c5f1l5PkEU^WO*1FQ$i|!LR^O_9`P^H}m&OV+Nq}q{#LcapOUauKftY6` zK^y!6W7cVCLYq$>LM}7<@5du>Qyuq89}+afq2$aq41&%K5cMRmW#0Y=wH-0YA>#ul zCCc{id%ev5vOauN5U8#O$+RP9Rv+Rd0zZh}evUDo|WHvY2w zDDCJLHUZ&2^|3e6swwuBcb`@~*7!AMlA9>~EdES@w)01#V*XBkRGL5_<=xL#X>0;_ zt@Orz9Sm5Z=&C@FLmeJ43y)%jADvtQo$etYbsl|iPo+CYV=~Bx?@{UN*@MLlDpi^& z{T~O-ni3g_VaQ-Ir2|X_?`#{ZKOzi$UxNXyD*d*B*OrwE$dS~s7MZXRpaSaVWfj?%0$j4CPE4gnnEslU0t=x|y$o?)v53F*;v1&0VeWX|4NFulVy3tOT?8`m%0PrrM z&{E1Vd&LH}Q2e3x4EtWFZ#IFxY75evpl z3em*c+xNqf$1)wHV_ zZ(>~i-wj9Ux*YqslJXpuO;=H0dxh)PjI?KJHiyzsH^&C48t(%O;Y?Nm6wg~R7Y}lB zxn(}qs_{0K`Yrb}btXyEN`~e})b6V^C zDm}!@T~{RXozlUEU>eA=2M7w7i*&Z+SSN*!qNnPInjuU~c6j)K0k`f)Be z2^Q3kJNKRP_Gc2f{HuNSCJAd3?WXH}4A?{faK$w%{?M_g{0s|Bsb4pf3P)7dcLPuH zN*h{y9K%UNr*b2p4@?_b)kz^dzt>U*{Z@Pj+_GPbcqCC*&2Y|qfmf)t)g+a2U(V9P za`E(TJ^uQp66c}nS*Mg*7ai>5omche(IX`&!p1px4jZ_?ts8Jg^I0 zCB?E~3WD~D@y}9WErg*3*P+<8d3pxIyze8b1vkAVYQZgw^lhcB3tbU3;Pe^E=L~mC zWH9-a{liA*Rp)6`VvxH_L;#>aRSRal!_~iZH*$Vk|ysH%G`mLM@B@a8c za|6^;)!wXrb`@?d)A`y&PP*ODILFX@IK0vWAjrNC?7ZpS9>o)~n9`!d4%U&a)N;_! zGW3ClP~oyw$~C0jp4*jWU*;6tKWYcn@pK%dmh?@2)T)HlUg^#pUkkWz685ewBqDzt za56RQs4C&M)v0?^3L_EBM{-WA$Bvg-k-uBveh^tZcXM63G`hw`_E)o_m7m{|j{mUx zM7XK>!0;|ftn-~uPvWjWk-wkpW4M9gu6*}Uz~sln(cBn=r-Ww$p7!qzB}j|41@u0N z&QiK7(?2fnkM>C6a%tm2?;OfMfPvZ5D=JKtcH%qIf!aXLG+R+C@yke(rG#k^eRoks za$$zpzZ(#Lf6sBePDHZKTAgr3Ynp?Vd^4H;W{ey>1_moQ=mA{?yUKWAF10e17cS?h z%JC%XK?J8{+uB2Em+wKCP1v2eHljdT9M_PCfW>TPv_hj=*s${QI4#ef)>rPS=m{V3 zcO7bJw3d7KP8J=5U(#YhS5XtMh77|FOulMxDAa#4w7F9HZwN;cX<2qohK?0Y^T`Kh zgcegN2P~9jG(FZ@VCuD%Jqkr(h7VfnE@(d5GC zO;X9^iKS)of31~Yo=7y1YGCn==-<<1Ti`!x8~5Q$89+xu2(10~L-yOLQZapQ+H*$B zY{P?eYsjsXv^Wk?i=1RP!0@~$=2^p}8PQ!#%6S!uWNy66{iKF74X}mdMD;PY4+5NZ z-fJeReDq1#?JZ+1+;vG25H(j(|E$+YuUR)fNM_{ysd#NJ%Frco;U^k$oA&5g%lqg& zkx9OL30@22-OYVW0zTsMPk4E!eNPzqp`rlG9SK~7&^piFwnrr7Hq1VUR7&0(;kBh& z6&-2XzOT>B$TQs2O$HG?LL=|<`SCsRnX)eUtfRT#qanD1 zhf!Nii1i@mxa09RYu3{rqdJv4uZ%=4$V@PUZXXMR*S@&@sZMz;@;ZFQ)PJ(k3>o5oDZBIB8X(E*yXUeg!O zRUb!P{h}bTFPaDnNg;p$Vm~C$Q9S=Sc%PJuAL2#~$ugZy$d8+CYX09vUE8(>*r37U~i4$AV>1C){{3`G=1>o$^QIy-Z0Aw(MpF z*}$Fom0J#g!U8QfzLY;ttETJTC8a#(c-zp*!RVdSS^bA5o zAgeK1XS1~Al0k?j&4`9N%h;yZ?7thHllbx#I9&2b(vKsTDdd1YK8rk$h4oonMm>JR zHr~&^)P*D4M1_*1gxLOd%fT30U5%zNm0%Z{IlRacJJbo$-IgBCrX&fg%+Ya#S%k@= zP)DXg%^e~@2v^$Xnw?OtemR3=FJvUZBd&{ZE2m*JEp8F^fM_u*@4R+Ryv_lHIfN1~ zDnoYW>@?&5-H=~yLorn|Nqcj2l899YhhL$P_Z}X0u=Cp`6d;E8U?vUUM=}V7kM>=T zfG&szb5=z}2Lzmk_ulr;_YacL?(k88qhYD7J&0_@yvk@d&q}cQ^ar@v-3<&4QkG~Ts#H5=haDLoX4#*Od_9s(#Ce-(v4{N$ z=9*eU%2H&*2D`SU*bFQx7co#)*Lpr+!fO98Sp#MD>Da8UnEiVmC~V*+Upmz&nD=`o zi&@$~?rm)tBW?~!`LjtwK$lA*F7wz76ua#7|TJ2zy*rh?ciJsPIr~im& zd=nM8ZN;cJ={>g6D%TP%Ts^0l(v|MBW-9>HtK|Q+*m28W?Rp1}U=1$nwH0@+G+}>M z-}#xPYCBBsRn^>x+n6e(w~SJuZNo!cRmiw|ywWZj>oBf-P{sUn%KT^9b1mb1m%Y#w?t2~m4EkFnu-iW%hPlQkw7U@5XYX>& z*&nk&Zl)lg9*4jG#l)aje#7}O-QI<;}xtEto z#c=0wmZ-??^|byFi{U2Qh7;SJ^7k}td(4YdZe2`J!@(Lzd_?k$$Lyx#0<(IE&s`=p|>ZHX{?U@ttxv1@SFVDe{E&`b(MEo!#e5iy=}9)5bO> zQSCquT*Bep`9HC3D}OPLTjuhwrdG1=If>j6NwbnL`MSI@xFf>63Y4y5!-;Q4>k)Rp z-m!ICDD%63$az)F$(^UWA%?m|vA2W8gD5)O(UMIsvu|ZiOvJZ|TrO+TrMW<~{}2xX zWj4lVv5NyQM_X!l%wmEK$J54RM*i5na9PU8_Ak~0{~<{s~|Ib5O?o6KzSV}H<-+G=O%k%j|+T1uU99$ zes5oPPEKaiv7y4Ysv+`uyly~Mv+h~;=k>-~p$IiOQK0Jk+`K`|>Q0qt9Oa`~)B{G= z_YW8XD0|FF5~X{5O5aC!x{r6Mks1rQuYW=qqPcz^2q^P@uT?E(8DGzX&|tM8v2gGzkduA=nRi-4tx;i28q;cr)eg9uwJ{Laum z&@;p3uH09Lfl!Ai{09{v2?c^cUJCk|1AR;9EQCZ=jXj9ej#oEipl@u51OlPl0V$*2 zaQWI=ok-;g4Rq^8s;}d;qWi|Be(aPPjy+)g&lUpN1Tg|LiG6rXS8ml%4VA4GD&D{J zn2%k-U5R7gQa!_w_8}|xz)KS9nD+%A#(cseUUIIb+WDkv%KGU&#$4uAg4g~FZTDOF zcjN8rz`K7?ly3Ko4KAB4BfHPzY~x<0riS5kCPrh7jUDCcJhvPj)%Ud8@6HuzryQ}# zUn><)>`%r9)lgo-l_i!cuIvxF=oZ=%-APj1v6#*+_s%a~gF!~3ZmU-^Ez|Zu#m)v( zN_^Txw7cG+!5CgadhyjYvj5k!CZuFIza%ylc+D z-elUBE&?m@o_)bsS^Fbo;nr%Zn|=Z7n=2>z5*LQ?%JOUpfU5QH29*WXrEJL@?w&!xrIe8%g%6xACR&1jn^?sGRtZRa}n zPG>IUtTFM|oiZxk{E8K;h@b=)!n^+9OJ!OdHfOU8Pvz;kku#$MGGcjQVMUWNhiNMJ zJi#H6!nm4Hdm{z-5{%I;q51u0d|Tnh@K#GOt}SRJd+XfofWPzmxLl2cx*V9NELK`m z*0mN$t$-DTgZIDq5bTge!$*te66~qhGHElXi-);;(oF8-sFc);Y_7_QsZzPf^1UtZ zBk#gJ<0KEasoJ5L(fkpohxKAd=fNW3eevw7XUln7aL|>$X5QSk82%SgI$SgJn*~XB zjFvL45?rpyGM`j<`JkX={`$v&%=2uCQLi-MRX?NzZ|^NtFarNmCmoGl;uyuBrvbG6 z)$NTDaKYG?larl!s!l;|-e#SDHe_5nZ;Ho`%}|Db3D79*-~O4FX@Cu2vuUYIzZ@=( zXf)CYjFOBLws>$9D82{Gx$BUi+eof%;2K2p4gi&;uZTa8Ubn>FQe zbslj~%^7(r@M6MadX1NE*VFCR^1e%x_mEBgw7Ov55|0}eBd7FCZ)mqam;cEp665_~ zIOb~Pp2g^K=WR#cK+nc2V-FRu%0_X|k*7D17x;HW1zB1$l9ADpkr|}3J2k06%iXCP z?|LRXlY+vNx~lC#0+Zf*ud7+gsZC4ppS@XLHZ1M)rzkqrss-zQ`MVP^Ke`Lw4M7-b zdce}0W=I+d@kOT<-*IZo4G8N%RM++)sN=M9o26Y@u2wt8RJ}mM($xOQI!!OB6>|5% zWyeSDQV8q)<(dmv>{7zQJ|HNoG|e*Whv?3Xa>sTgp3kmOP^!3Jd*Xic>*Kkj>hqg2QyFs@dnj!zk zYKAZ~?5*?f#+EpeJ@a}8mM&1X4{>o>{CC4gBSwxnXr@qkE0Ov! z^pvG1zILX~J7m4Q&l@c-Pbuf#R(3`mG3u!8j&*jOsRdDbw#eAQNRP3fyT(*lI^XFN zxFa1_jh7%)`UO07hUT&JP|6Pm7?)n1A5T|$MgoKSfw>k>gl2gwN z<3*BZMl<_I><~JmA{<;Hdm>N2>T__i|G4o?VDDZrw|OqkmO_cGV!$g?tfd`_NBIyh zAFo9iVV|Lf%A2{jYgbn&&&JQrV=g6~vjz9Jyv_4VLinLVrFl7dtmGihlCfXYq9b)Z zk!O$c5CGj5z>tlc9tXY)WVrzHtildxIq%4{^_Fo9`^#w zTK!Fl#7|c8^XJf&tv6k&5JG=|yn@TVMTubCt*x$K`g;$YJZLb8{ZV678l}`CO|RHZ z3l6dqZu=Xq-<+wJqTZ?)-6LAAQpH`6S%$eo=}SZ3dB)qcF&Rg3=bhY3-qMuKPVyO) z5g9ob%kue~kx{Yys=CV+se;)uzE-IwlM4a4GMaiE@1%Nuba?mBl9FAK4p+wNcE~}G z;(B~4mm1#|Ko{Yh+ikP<1q9K$)GoYI@8;ZSHr(^J1VWdpHqEnoIy~llW9q5JkQ)d^ z2*h7NpU@8Y}Qsn9I3Yxe5qT;aSPO<8Un zbK`Z_{K8ZH&l_jj#WqzvkDZZ$afX3+`2j?jK{1j3eHg8;A(`H{F}*TB(wh98akG+$ zKKP<(MIM+F(aU)vAZ0s7pT0TySIWbL0kT^q7!CzCL0yj7+*v7x+XF!= zlU1+AUqo(!3}Z%tSyD3?fO{h~=Bv0D-9GxLdgFiKF-5KrMaYhQQL`F#9!-sy!H=gE z1DwFkW-Oj0`T#@v-m8Qr$|biH6LKY5@H?P=+?d zo2^1K0Xg^%KO@bTqIiMs|{I2-K}|)p1u?=FirmQRcQ}oq?!`{ zZIJfYLE;c&(11d)a+Il=v1gb4APJ|flGo9_uZw0MQ+P0CT!vECPg^{X_yn@ncfM2^ zQ@2VUZkl5ck4WO3tG)ZiRChe_1LY~P5%ErRrWBcQ@Lex2EK>Zw0G!MKl^EBM@^Xcw zVEhuG+iy3do~s`&y#(?F-m(^Q_dGm(h{DIKBT3i|cJ;ui`^We`1-UP2!)K($Ov;)( zl52^{6cH7@NqJ5h)~24YJ3QpWGliM;Num?zI(!cgvx4NjG*?lx1QU^;*o?i&be>6W z_I2Zk*65x6QeIQrXXX6}az0+XqlP+uo}d%N9cfy7O;>rID27a2yLgbh!e-Y9Ufcib zbWMBO57XOND(n>8=v_Tg*&4)F44IJ%X{8(U`|Fw(b)9{PsIz4o(kmhvTs;rz4q>!- z5OW%0^zxdubRVqWc||IZLu2DF+rV{_#1Ye`k#^Z@&kNL|7qJs~q2?v7F?yY6!kwa% z<~0Un&K(NBqY#t=F=+6@Dm-lq&WKVl$Tuk-(NORHl>yxwzwGE z1tTgXK(egnGb*Oiv92C=5zC#LKy-2&n5x`YtOK|Hz=UO$C93nLO!D^#%I>W-e+Y-x z#ec?)T*fPThOQ+}znEtPvlehphRD^L4x&c4PdibT1XdDS&hslJ?U;Wzb}L0DPs_D( zwtdxgJd(>B&IBS^Q!Tq-eL!?JwPgFEt=!Nxo;3*cVq(&4=scrk-l5Q6a>n$4U1A2m zmPM&o@&bSTq$nbA(}ZbHmQ7yEFZeo(yS3y+mUIf*yvP?G2No3HUXx%wH!gQMkv^1; zKC(+8SI5+eJ0&{L`r!BQ-fCs-gFU6lAvPN6teIwu^-SFWswO5|>-lTpiK}=s*M@bX zUnQ~!JyJ5+=+pIV)OAHGF1T1b9PsbeH0 zWqHm*M59yu7om7k5X;}iHsaNNAnSu(3Vk%fSS95 zER3)95j%xHw?Vfx7vb@w=+%5|gr_6epDR!xcHT3Kap}~q_?mfRi8DQabN;%)FX_9a zQ#-kftlnQzzMya4Jbdg#&-H88PrunlPRpIFYt$mA%o{#xY0lv;AxW)mgIVb!DE~Yqgxd zGrfeDxBy76;7Kh%!+5LBYCo#&%_eC3saw?oNQE=S-BTC+`vuX` z)W6-DL}xb<>GAj|^lZTnXPvbee&UTA{e{CH3j?7Kafa2{!Zn}DDYCH<+pNh{oQ0I^ zewbHGKAvk*O>eXQ6jTvb5M*Icl;7YchZ^-x(st64A7s&yi`mH{m1)W7Fy{fjF0@gT zo9*r+=}F)gEwFE*6N|Qbg%VVy#5#-m(=@}>!0k76E=eh5Q$&d$tYgy9tkvZi4g=UI zq|wR4hwYJ@w!QE08!pRLllWOCX>?(JNB2O<*Jb8KqZHIwef@>50i$7NWk0D>9RYuS zcYC}LPTAW(BF6+k%9W>;jT4eWu)#UI^$w-fXGfanML+NDdShrINnExsC)`Ay&Jtth z1Ru<=9P^Yudz53O)vsCH*NV6^1roZKzRLdmV_8PMEzia*!pNFj;_afY|trYgWHT4wM=sg@<-ArlkT%`Nx6eh;wc-07wH zjO_dVS~lxK*;!<#LRD}+M1<=xAz;=3Zbk5c2$v^J*#6iXQGsy^8cP~nB%6x9g9^|` z+WF9u+3$W{ufiE_-d4$sFLPAU>S66Odaaje6nL||{Frt@zxi{T-`z6fRf|P0vQAFH zxg4Dypxb*57=WM-`{?Q(O9zgkNLBBm(9sE_E<*=@*0w-q<;{GKf@nquqbYJ}Hfeo3 zS6NYm#6hA1GuG}ZzP{jya?q&Dg3xywFQ3}cec1`Fo+D0wB(yY#K?+UKhT z2L(JeoB+zg*bK|PtqZg?Ew9mciS0WCwGo%hl})P(cJ7GQJX11g()pp}ACK5j)r@Y7 zMckxS6f8uA(~fWyv|y<8L>Kel>XZX_FEJ>ArV11_Q4rUiB8btGHV51QV)~S{4lyi- z2Lw=5EQG|wSjcCS;w#`=yHnb12-|WKI~CZ#Qx`8oL)&B8-P!+ z!c)>4y~)Mdw-a@Etk7qQg{e7raL^V$ejjNLe#L%6smXF0T_l@cg+L#SF-TR}yny2g zR=p2iy}s}?AH)R#mCUx;H646sc-bEtnIgdYE-UDPvTsAsu;i~YalQ*zv0_uR>MRL? zB59M1kCS!AOv%Oh6@k^h4geN3i-J{ZhU*Z6!MhToRfG*&&!HN|j#LIb)qD01sGNyi z*q_OOUl^R1!RtJa;j(`>6cQ&rT-rJxFE4|I_FJ-2wRV@+V4TU3F#F{ zvPMjb<}P~Am&4XWD7W*1BzncTLa>uTNmp7FS~4+k_9&D$Ixf5MukZ27)uUwNS|qq& zDk-S+(NXLKy+Ph|8R6gcTSPE&3V;4)MSI$7p8c|3H^c@i z8?piZ5-8v7AZy;K8_tdq1*~TBvKgxc$=rxg=T4TPMe&E(`Cej6v zX{3aa<#XEri!;E_?q{I&!HmU$p@v3>tc2D9(JO>Mcpu(pW@|NQJ#l5;NvYwsyxG|u zG8FWtgQsM2OTz$o9y+2I3wRJ-_D8Za7wkfL(+i9Hc>lowM4LIQpB=LJB%`%Fand3s zOvR*`M0;K;Ncwp?jCq}^>DO6sd&u*nkpC*CN4{+x+Eq%aXbHPbgpI9ru=r^$gGJJ| zpUw4f2P_%R-aFme;=q9=<4{u7*;(d>kH=OK?cGR1yosu>+^xo1znSen90o9 ziA2)Yx8W7PpO4uP&Yti%B*R-dgtY>Zl?<`d7@L@SA09V&R*SnzL)V<`BriYdYTn@1C zsPEc4GJAnP+9bI)fawKUfV2DY2P2yxi?!`@Ip1{l@F4`dz@HF$AuAlMk$`@vn^giA zhe=f9qK_t#_KAg@TElMaF_DYeQB_SEd`?!xE6&?USCi(|!(GEM7v@hagMo`qu>}-` zvcOXo&3avg92)@_k5BpoKxSCHHqm2+#J39zHkJT4j5y_Od!E8sF0c2@%^wE1pn4WF zjNK^jtSl#@C^{`P#a9+PPXyQjY;d~KMA#Lj6I)*NNM81u9bL%p~@99QKj?$XIwvvrUi z8X|tM-YMPD*vqUXtx+xi*JGF`-H*AU4DxXkoyxVWKNs|C&DDF< ziPMrVyyMBNQGd}5nY?BKM--Jneb8H?(|%ZzzBH(lVmh!PVWywaBEPfVVK2DyrphlF z4;ekO6FH%6McmK_(UF)3;XJEJdV}`E6FMsZFnut@CuzvC_#2$lC8(e0A-3i^V&vxve-tgFyW zXbR?8TS21pcTMe7^DNlf@^?kBL2+j3WpP`oryIORnw?{<#oyiHd;Z)n!cyK&5y`15 zg&ceS(v{QD{{8?a)vcImF)!|OndnO-;~KsglMaaBRF8m>OBK$dxWR) z?0fn}84ngBW3KaeKqYEV1U$;QPB1Dg=ZV#->5%Z<;+i`aU1a;R^Y<8{tgXuU$H%_CPRIlpVzEWFrSbjQ=C8`2(NuvWvBdJJ z%{>vhoU(W2Hs7!A?(w>Qs?ti6c=)b9;-=E)7E6-Ed$$(eA5opP%l`e(#mW7U%TYTp zl5wfc?RSu$UonT4Y;AJjb1>Zy)O$qEe9;5s$HNkvAHXn^Y7k>GXDBVTCYq4K+UDoL z%=$bSl=7uxWb#jJ38sv5|2!*_&EBxh43it8@I0mLqmBs9dn3tMmLLv~4LcU#a~5BH z?rTr_k%?4MjwJRKLcMtObgimU^S+5lQBla^fALJxVmTH&{veQyC%~HptBKnwXQjr* z6%}O&>P1#sxIP(fN4_O`ZA^iOs*Taj@T-jfjZDU#4vu$*zKLb9ZPT#c;>layQ zy*fO&((1d@{>I;-Jqp_`J1m6m3v`-M`{ZP9Jz_)~13E{ca8hCc=l;JUT=*TS1F|=f_`oRq_9X z3^$3M0NHM?rh)B%TR+E?$@rymQp{Ijv-Ycg_s3XWUa2253OM_bzHRu4w*CmrTWCwz zQ)~7n{5vEcj0W_$00OeM>MOsDuhRK%?5%CKji3)vOlQRkNa5_S+O*%K)fj0y09HZ$ z0vrVjeY&>vdpg``6Q!rfMZ>lCxtl&ZTt-he{!?U0jt?66l~T^)4ARbRSBb6zX^lpg zM@IKxZwf+r5g?jG**eI**x;W)1PEk({QqRWC&>y)j4JN=++E7qiR)$jxBJCFU*>d{ z6AqN40o?Fs4A?nu)e%)}{a>FxKo&+nOqtdD*qs10->bylo%>U$uV5{j?faiy>zlX1 zo*M9Gh;dFka#=QPU`3pQY-j zTWw#Hh>5jrA|N(;%Zy(X9t#x-EXOvMlkiL6pSCa%4D$m_lmDq0lM-ioYTAMw>d@2nPW$?@@Bj!;;_bC-OEnB zBZJNKG!tJL5IIFfmXYricjt{MCAGCTc0DZmLkkyi&kmcFlEO0YG{=7Tqjmiau;T%B?g&Z8+(;55aM0zd(io6-hvK7X^9zAW{` zO4^YyDR{$!d&_O1f7Cr02k#UTxJs=_rKsTfz`IZSQsO|1`xkhwXu>WQ4sU(pl*a%$ zyJLQK8*z8nyX^Y&+S z*<*o@Z23gRVXODkCg9jLqWc$x7;z#L^#c?3a*Z+52!QXIDIPcmqql;xC$)q%P?;Ca zAsWOAirP@3dXmE(Ke%FV4FprIXip!Cn+N};w^5AdQT^Q{0-CMF)^({%DpwJ0QR&lTA#>am?v<5 zDu<~ijts#V_sIR~j*~~5yf)h@SppFBVJZntdcMZc?4e%y^C)h>p%~`?w$Prml4Cg0 zUd{-i-;$5O8-VH0HouFn64DA9wBn0OQuQlk)%H#aU$dW2d$X@gx#~_H$g33fME0Nz z<^*tLM+~f$aubro{4`L%b@HH-}uLf#{MSYhVtm0Qdoj`Q;S&P_@uthMT9oe*QV8%i7B2g z%iu0y*#DRKp`%xq;dMcPUP@(Cd%1aV*rI~o*7AS!Tujx*$VbY_DW447=wuA<=qlLz zD3{LGD+zpj*CJL@XOJ`Mzhs^)>7h`J1%{1XT6rLOd)!xx%wIcQQf3J;d4w5hd|;k! zysxd~oH!&Thi%ZFn%p$ENj3w-p}T&75Nza59(C+NYFnQL{VHgsl`?Gb_)yTf_l%G8Jtq ze6n6EUE(EwkQp^=yHBZ%@KKj!+D{koFlBd8fl4>pg=iQbx_L90k40-z*BCxhs7iDs z+=VY|6J#EIm4N6lQrbAskp;?VhB3@6B0&&hQ6Ov3KojsmhPvg^Ot88&Oa9X3T`>c| z&tsJLrK1vgDR-?<3T5W@IP}-Y-x^3R<*wbe9M9e4oR=rhoR0YZU>x;RR;M=`tx+!! zEJVpM>D8|bs2`T$gmh(PBDKQ4a)(6@mS7PCk8Q5}2RJX~bH<_peOf65Up4qe%Hz0y zW#t21*0~Y}2)Gl{Cyvr3*bq9?Bk`f~K=mm_f|iFzjG$cBS&A+xfMzpMRP*YH0(3Oz z;aTE3LR8Xc!=k1d1Q&D?LC*7Hqm=q9s^8!?yoHL7qU~k;n|?I{LJ&yz0%R4nqMkMqy5`0XsPx;gpg0k{fgg)ab83O+Vsne^d z8f?-mP?(>`f-d)aQRhC*w#;`Sn-tGnd->n5XavkTI$1zHqFN~Sv7QLA{35+%(czO% z7N09W3+XZ5OBf8wN0TJXTm9_PEbHHth%HktsJf!k)|#L6jd_|s%*waR6J{eJuemIl z6RZ(}N_N?@L7nIbX$TQ3O?m)~%2kv#@oQ%-u$~swSVNur z9G6ubb7p3nUtnZ-xA1JHhsY{xGN2}__0y@iQ`l)cf3$m{s0gd^SS9E*-5zHvfBT>@ z962sDyvorB) zPGe|li=@qsg6`KMaKK9fGWt7;`^)zDZ503(9_O;oHg_igH62GV_}{}_@xgXb2Y5Y3 zOIQ@Xe}~JFhJF0q4Iv-lFOiCVm0#vnC+XajYT*gp_ZXohYfc8gspyooqh2Hk_;@-W z1^ebj){xw0NglCke;v~L*p_TQF44=vSyb`yx2h#F`x=%mFd_O{`+(2&L6>rH@^_mG zJqw3~0-*@RvuRfV)r_#kNnO3LRbBkH{0I~()C*0+pzoB5*S0Pig2UBU8q#ZWkBzNd zt_sP`W}Any7;o?If3K3Xh5_GJTvv=4COA~vzBhNZTx2NXHd%9j7aE(zaF&S?)_BtY z(`65Bui-tO@Tb(Hd8bE9-Oj>!fhYCn$X*M7acf@qOh7?>ahS6ou)Ob-qt$=%t{94F ze82k>Ce1IkbhPyQ$1R0^1wb>(({0r3WKVT2ycnF#(0eRuN;&J4lyIFjW!$)RdugRsH{C0N*wrDaskN#PCuvSv(#;W?ps~?=Tl}j{feAlVwqe47O8X_sq)aUmtZ$e zfYGY952S*Cyf5Fj2u2{66O;D5KgqYS5qgbrO}|8+j9_R4a($9VXMk3-PR4Eglts1v zR!PZXdS{sMyl6A%Wu+t3#NM37PZPeC;hU6lr-XD=E|2gecB_(At57ZoS`Opc<@}`6 z2ac<~0Udw6(L~%4m!=Z-{Y9OF6v0YLr|xZMi`e&&}ye-fE)Vi?hjKb`i??3k+s+V&h%7Cg)B2m zUzHGUp{$->D!^VfaWvcZ;vSBJtl#%F3(W*QygE>mIY!)EvZT;yJU0yN)6UxwD3^jm zx$|jf=1^h+pzSJ`9GCjbrIds(1#!U zw<+C4Fvc2Jw|eoKaC(ZZio8+grYu6QZvQ0`o&&~ccW-+vYkgnIiM(sPlZKcQ13Ci* z)*xeRN@{q|hqZfH<3+v}q214CX}q0}Ck|q)HhS_`KmZ8Rm``fHS#n^IWxuG|=7(f? z1ApitkFMt<0Mdi#l`}F#6fh6d)z|iL@Vp7^cwi*%ykzS#e z6~d4dySO1H1%>%yiu-3|jh?$WYmOt}GZ=~zQwr>a)#7)d) zD_rOYK$SG}IEu!-?nj*2>AqNXAZ5hE!w=Bx&fP&pg)FScE8<8T)^&^_K z-98nN3Hj78E9Or%M?P0!=^cuL4n4R-$hMU-3^vMy`(Kpj}Kf#N;;j1D$)prL;J=jAe;?@Ih9co z^$qUcw<@==lzqpBqm5WeNb|U;ZbEt-0Tu=9$1_}3!N~kXJy|xE?~f8j*As`|Q#Jv4 z%H51tgu~K(LO&9@Oj-+Y73LvpyJta=fW3>H>^Wm#+*S-r{oiZ*bTe@4z2#P4?vuRePDQAfzs#XKx> z39g(!cumgu(9@fdN2>p&*0Hu9Mb?YwOYm|+T9a<_mPb>BCIhDio7PvfX^j|8U6bH& zhV)oKTy)t6$qJN9>2_Um?>6M)Xmr;Kl*^yZbzUb1ZxLKg9Pg8_V!uS?r7jh42r+zm zwQsiZF}Rl}uc%-|n4+t;*f6hg-W(8KedH{nz{;73@_gDQ(4p9 zc~HHaFHc}>H7Ii~(gFkY<&H0AWohwkjzgm>q_+6O$`M-#l z0wcYw!G@MBseD!e1MVCkoh~+&dY2%j`AbyTId7YYpwQo!rs@4~)GaEt1Qzt&v(~k1 zAkCBbT=)^da!!Qc{q9euHmNoD`F|ZS!BAIZGOh7MZwt=XlUx+d=RX*y+rhGem zyKJ6OcyuUtK&`;tua4pulk7^2dgJ?oI;?;LJqM)4z*Qs4w%GOuCEN~BINJ%tE&#Jt+?Y?3t||00m_CuU-cGBbg6c1lrKk^BcI zl;8{h;+_s^)Q#P<2~7GFW|mEgU9$x3A?~e}B4+>5k8f79$e*%Dns!8nw0J*pZgR2H z8*-haGId)R&U@jnI`fyv>-_EyTLxl;)OGztDrfOpQc6;;RYF$7;k6s03Rfz2Ld z&wHgbpj5n$m>VID%SoNv+8E^WDx6mxpAcO0g?c z!#~~r?YQWMH0@Dzow(CT@y{IIIOAhU#|G3*x{3|rO9hLx=G=$?D{;h0r^GFyH7fj8 z|1Z(YSy5sqI`=nvAC!NLKU=OX!9A><&Z; zWE@zDz#{FHHu4*-laFJxr&Voi1NVA!@PcmJgT=iYrhx);cNr9>5vi7U0@-t}7?0vo zzO6HC8s*pKDXxhkV zPyxnqx)-`@t36Row#Z~}o+3ly3%416K46q6cDU@z5zK7GsN?+n1Hw&5{_}wgZ#7*B_XbRc7!5?% zo#sT-9LRX`#@(?Ad>?x?QWTo9cQxKEDP%0IukG1svDGRn)ruui^{C!H>s-1boax5# zOxKWD`~7QOO5?#FIfNwWqjI!{Q+!~U$@VVG0ut_*c(}@1itnV`E>07KUBC;kNa{9n z9x?VlE6maGN<>qCM^qrlDpo_?lvRNt4bDfQjrBGCe8uB=y`x#H;V>4#rvuj+@Qqko z^kB2Z?vaOTy+;CLfm?-NL1mjTrQvAPWq`d zD>cZevavO*{-?}QyBB0d{C4)N2Gd4Z$*OXDXnP(ljFj>usvh3iEoau-Y)wbm5jaF6 z-Q%T>n4G+sSAPA_n$DbyF@HTR=k!?Z4(O-U{$Wh|@aO_C`$)IhR!htH&eT=trgG;l zoL^-l+4R0hxCL%;wW~^WcLY>nKvnzE5lkPyZql`|^|7WYF8=Z3)dL>A!1<38Oj><{ z&tmYe>kcOBn~ZY>d0yAYf1XG(dl#roGH`E8lcM%V{9mFmD0{Uhp1%d=7CB`N)V|o= zt72WRQq`^2;Z;ZcWCTTj*Mu=VdtDKxQA%Pc7!li$cbr?m;+GOc|8i2Vz|*BL;mUD^ z;%mz}sIHlhL1(aX(5RV@&g%K?lkN$Omgi>rTi&cxlzXgL?POM#pEss3$rG&tG$9x^ zxGXVK**Dp9#B7OR_rs9dk{y(%vAAS5xM6#k=g}F!ABi6E1xTEUZwT-42rOw=Pu`Ml zDp%MF5Ri4Pw8EWDnyrS0JlqBh%2n)m7J;Awtg=r=aX0__`p1yBb(JC^qZpQ5#|rEi zxt9ZCtL31vF|U`|py_AU$y!7HQt)Q?G5BtOx~u#n_2&jZviKp-g0Q%MBLUybirK#<1gCO2RLQD^ z+4vf2-f%9)twN!pihE&WLz5;l=L*B77(_7kiQuPf?g7I zLz;v13_>n&`F|97+<4CKk9A+gkZ@U!d;o@j!+vypbs9j2wZ(U42PQ(s1?D?@q{vTF z$1#FMohec~Uv9>!$-;OcqK+Q^H{wUbC`>}E}L?R=x;V^OKU|4U< zp_!8kAQ5G1Zaagc;r3L97EHYLrq&?*VWul(W*t&b=4^lC_*8@4H^@emUUUx?340L# z)+PSr!82VT;ylIyrVcA+3b*x?U@P_Af@5@n%s}ruM5U~)A?pto~@kV z%UD!iJB+P&)e)ce-q&QEfMYDCktU)DfFHF%$qAygTM@Iq#bqLzU%Z|?i77<1k7%eq#JU zMP{zYFl~e+xSEeZ_&~2`qEO}Q*-7g$Ut!89+Cc?|wgt3R{_`)UA(PWnh-@D(%L64$eunOLY2zj6|w?%eo5befnQeBU$Dwm@c)3 z?u*|)NIyHF!DgV=h)A%8o~PTK!m9?QW4bjq`D5vfRD*zl!L^hodbZk1gjfqUZ=j&OM}4Jt9D8G1wJxV-G3bWgV8xv31!6#Q+L~oBX>tTd!F&&NcveQMb&fO8ZSr&@Dn%~ zhy4RB?oFb|W%cP9XFle|9}&^9P6-L0C{?CLF6VWUL#*TJ3Z~{EBruK@UWis7`0H7b zHFNA)z<+1vsJ6M8FsM>Jxa<5xymkHFzO`!u}(N?Cf#)~ z-|7Hv7&b4Zip%4y)yr9Lf9=}y?q8JsC~a>|uqKVaV&w;9rdeFJu}F&z3ow2C{oj!c zsN!4syQo8uNb0A;=oGi*yHN3PSC}v8lJnS*lIH1M#It0>f(C+mA*-^ZZ7x&;+p}53@cJDm=;2t8Qo{N2)MGn`8I{$>jz+MUJLq(HDw%<>XUUA8vVD&jm5MPmbz*Y5T%Lix z2kHERe3_IzcH>tEU6*j7oGjEg~acIkK0au zt-w-&{~H?BpFAi@HK>zxA?}W6JQaJn?=-zPm4?RR(Bmlr5EV`0_tv)A0oi$z#ihtU z*b^~a|MFAwPW81h2g&!;p~;=V(r|V+Bjcy@lkN&aSM%sH+*n$=k2+XNjMD2i!65U# zLDLC_3HicT%S|8o6ywwdEY(fS(eTAN<4)k3%qrzzW`j72sL|yEH`UeB6M&BYqUZ4_ z$hz?%d%~x-+3R@gUv4n|1EpRpeHss$4uvGM##Qv^ZyF84T=^ZF98Kl%`ITzeFctqW zeHy+2MY!y%-3J`@AArhXCcQ%nu?HTpL}4nYj8y5bxYXF1mg1gpQ4l1~@hOnd{02rT zultKuvNOJvPq^R=0>TeV$r@PX_WE6{{wVGp91s6pE{d0fFDx&f?GyNT1MKlkw2nH_P% z;&p|Ks$lHcc`;?g=@>;y{z5n^hq;61FVUvSOTXA^-qY>E(pRdQQAIJ#1;Z_W((3ce z&A$QZny^F1+!ZAK0R{QzJaiaK+x%L0_j!Z39?&5e%N2_93 zIV$!^li3=^FEPons|X}kNcuC~#{(|;)bW-llkvj@;mGs~rNSW&skRhVd5CYTgpb=1piBy6e5<0T# zy3JyjweU0*_!yk+)HrK*Iu(4RT}r{;{G!$V3@nwnkp+|cOVl%M2OiLe6eBJ|isuG3 z^G{c=a(y$6onWI!XRG6LCwE6o-N^7=>GLgg`+OBRuIMVDFfeGk$Mo8;h{4^b<}VRn z6;~E2j<@LeL|Q<)Rs-qb_mY%pYt*>M)GWZLbLy_=Z2MHWHrRXQmZX2vuWCXb0djaM zou}vC(t76K8_Qs-#+SJBBdOG2Fd0%ff%M`moqB(=jv%LA`Ozkv%8fHDxEPd0EaR^0 zw*ku^=9uAs?%o&NNn^jPXdaEW-=z!9I_58%k0Cv>fW5gZ1$Ul}j4lhlIb7w(cjcu= z(N?&BFT(IgvM`;a)f0(M&C#8G=fOeh<*U_$27t)OILF-H`PH9j`x~Wt&brf--!6;$ zTU(kV@ z%}=)8?TdRq+jk^q)Lv?rcl#Ib*74Awgi%BL&SFg7Z526&cRhQ)Qw75D$JAe^UPo@V zW&Y8Y80r)uMI279)&+^t!;(Z#Snn=yu|>C6O(wGSF8O`?Lce1lG{}@gy?F%H}AOb?Al2I8jR#%}E#!+X; zu7US6O!?ADZEPAuL)W|IRtai6my~__jicOa7x~n#ZH}}XnPkcwQ8HbYg-Fy;-7eE@ z_8v}3umxTbR!4iTW6-QlIae#fPpNn*S-U~TRi#-9zExC^tYpmoRcU>>s%V!J8m*Dd z1h0KNSCvp}r|#G|#?oh$Jr8nq-_U6U`uRn~alRqb z!w#~eevm+(6bW-zYZ3ziWAR=|GBtJKM3KKl^9>;^%EOwb zw=u+~M=t~390_~k8EN~?&ymJl;H_ZaRu=v$paO#}55ULg`zlZ&yHdaVslUJSfP1YE z*k~4n>)z|tm}@Mxv0FRID{1gcjxA)H*~A!Ke)tnx6@O=MbW8CB6J7sftaSR$)=$)K z7XJ*>2^1YI5EvcLZT5J9U8b4|P;7_DE#ZiHI%UJ9?6tn{SxF8d*P~ZnDT#OQx^CCI zq$|K%=R<#5ZU1BwxEOz)jEZ=`Y+53fCze$7by6S8`&ww;Mpk}euBpVb9TF<6HzIKV zhu$O$Rhs01Rf9A4s@XIFZe{SwYKSd9fss>i3mydskA;NNcT9exYGvfwy^4EcDdc-k z;G+-$rDrLuD@H^4Y{PwG%l-CIoOIK%Jo}4{wik$2^FH{&a#DomJ4bPuLDD7oVLRpX zqPXh)Po&JTo<4 z9m8b%FcB9d=D=_BTT>Bwj|4-YeFWc*e{^B6fkV4UR<)1^23&%c`=zR~Cqyp{Z#g5O z5}+}A>Ry&wf}CQ{nn%u+^i4&~YlUibS5dzBGL@oRG?}AW33wGKoW*<|ve)roia)0) zRZ}Fb!Zi5%=rZW?=Y^ibN|F@o)F1@rGjdn_#_OC;QynvkY^(O7SsWf@lDvN7y)?_6 zT)~JXCj`L%J_o{u?C(AcG31E^%#*Li6R_A4CZB~vSG#_TeJl4uB0d9rY=gLkU2(_qXGbRI`lICATg?7n!>fPcGFet+!Z4O2X#mBt)L-I2>Rd&x!Ysp@c` zA;z4n=V(AKB&b{C@D@epHnZtrL>q#W;pw&!MC5R+Vcl))BtcyK6na8f_b}J(x9E!; z<(4eU4dJ<+$eWcC99zxdsX^KEgH+rIan3PI;)O|G0l`%fHgFTwn_bo0+5IFrBwvl^ zevMCoHw%-Hi|)|=gBRNGC5<|Cd$*c16cv?MKpe-$pU`Na9rq~k+aO?x*(4txJ}@A_$X$}jRYav}q!Aniul1V)nXf83SPcMyQWHr!I>sxOC5WZ8rzjyg#D! zCPz~_@wN|DOaY0PBp>s(-L#mQnZml-**Yo@I2B%=OG<37>JTioJbwKS^(bh`LfFdKF8oSk1(8n zdO>!T8AmYw@*HUfSHm0IVp{sE0f1_&L$kC1A)n|_A!%8CyE1kq*kk3J82=?_Z-W2t z(^Gum^I}-3duidGw|d6WDvE=)7VC)t@m3i~YN$B>D7ysLPn#`te)S_~S7`(m-+a8J z!Go4gOqz4loXB5S$zEjj-LbFTvCW(2bi7+bk({!s8_ma+;KfYURe}QiFX*~=Xcli| zpY7Mh0xL27m**d_-d{X#cCrcXJl{+w?fRxTT^BzVGvg}#`8dPbSV$#?hj2)X*8Ig& zxxeWmWj_YhF4Z-^Ik0es3wKZ9ZCGD#`&3PsX2g4Xhm`MVms1&p3)jp0G%XqT{sIVS zO6B?#^UUCBFrB#>VFy)+8?Iw{g4_tLbf;>y_&>qiA8bnmKZ`n6aL&g~Bf3nfC@18= zY)&A;Pa0;z=T(@zk31tJ?0UFm6pj>*tgu+4PjYa$mLEBd39hi5NUy4CdF)Lh&e2vr=>oMTaHhxlGIU%JY>Y)Tb0jy^krc`lwltOsbXQ)vc3-`5hf zo)u5U(Q_qy&x?3Ge=Q&UB0xakGV~ljPqyxTSRhqp z3KMvsLtlyGpcQQEB(l}nP>&hqL*iSK>Csi5rmF0jE0f?`rFK;%rG%Z4pK+$*ew=^y z)N~jsD3r5dd{d_l_Zr`cGY2OsRUeRIX_EFocTLt#pl>58zfTSXRW%nX*O9+Al4A;Am9|R{u05 zB}Cd2rmp_UgGDU&N7&EeGmf`@UneoW=C1{uXkL>w+pcr=))>Qr7|~ z_ifVb%T!RyGjTkb3B5`o+rKMMvBS3L72}ea+GPl=x5awaLk%@z*n;&J&=ilHiad=-Rr_4w%7aPa=$Jk|49XYnnoyH`pE_;McrdT98DdIJM3eD@tnL23LkuQ*fW*B2HzVhRDjjue zf~XrFMpa21T;tgeg%3w6s4kNIPuFyv996L}@>CtJJQKY;Lie7d^Cthw?V8y+IR%vy z->@@6_X)TUG1a8pY@r(~5Q=;IoPanKY4u<>?5noshcBELH{mR}&v_WQMf=_5GXv%krW5s_wz|Ewn+h#h^B`ilz_AbWH>1!byg)(5%FJVrI45U((3Y0g*zn zH!3l7oPEvwEvMA#b)Ji{3gy2?c(xVCKc*8JzqF4`9=`tTnd4cbxD%vcl1A$@shFMoLcbbCeFw zOZjO&|C9eM1su6#6505KJ=-PcFi-=}uSRr(qGWZA-CVYB+R)5~_Z<@-k$p#@xU)!zG zEyG-i#{-J|zFUBKI?$uvk4OJKmsq0E;=xf~5(?gGfYjR&g>iAft4=aAz=s(z*F~?7gE1-q?sG7U6MeGAQbKgwI}Z85G4ekMn{AGnY)m1*A`L$0<(C?E_A%)B58#0-QG4KMPWJ zS@hv$n@@ICe4Y(gy_)58xP;IkZKFhE`ZbIz-LAiEAa~g-!6CqQf*0y|kE!#%KB@LM z_L)tBmWTHK*}Te9jE2mi-&}56piA-v&84Y1HI|idH-ImF!U@m~17Rf1J&$(Mg?1AI z3gSpTzu&*?dOFEl+x$Fy3vp*6r~2f>)q@b79qP&Uhm3b?|LAdn#El{~=3oUotF^)j zmmRrx>J+WI+vv(yw@^|%qpMGXtG9W!s3_m|*f!3?EbbGE_bR>Gf*B)8P5tO|k!RDd z6qyFU`O?Wmgy3crnV=s@BgxRk6c5>o%DZnNg;p;QFq@@%d+*EGo|+{^_1>oKt*aHA zy0jf|_s19!@>~Twh1E4{UFIz>EPB$+Vq_p6#js&YZI7tG6svB2KE`mn$LvIYY7v6tIXHz2l`c8B%8?_;)DT6b z5i$tB*gMzNt{-SuZ~g6UTL#y+Lfje^ZQS2ubjydfKUT{T`^nh#!O^$Es{ zMA0vDCc%7Iger&nCyp(s2IZ{0627HCZNyEs^M=gzA@4bLRhO}DG9%rnC4PIrvy2KF zRAN*sDBpmua7&OBU`iJ^hBm8cjM6>ueocr8-oJ=V)K$8uI)E#0{KiW0bz{~~O$3-y zCrZwt@K87Fw+TK8ho(AiH=317f#d|QB=?>5?u7TY?U%8$KJl@7yf`jn(XyRFwHrAP0s-vUg| zLm1t7w3&AP`7^L_z7Y+bxw9@!$)h;&vh4l6ui1sX%8bvV3Cn%K&mX!UzghESc>eaZ z>{m*%pmbW8Q`)|HSag4UQiaYhAzGtv)9xBD*Ehbwm66Zg7e-4n#M!Z9wm1%twcYey zkad)JQQ4U726E1kg)Q4AGipt(qWG*UOg)cG5L1=0#aoE0_d#@kJ%D$vrci+QS z&6!HQS3r-ZPlY-SWJU2*QgUpNsn#_}B65CfBPIK(3UmhRIZR`j`Fdzcmr%y?F7+9D zn%*C!WM2^G&9na>H(dzXJyb!SPaZC@ zXJy=Mx?SnuQtf{w!|f*&+T}DJ{T`}}(;jNrC**gyaDUsF-N@wr#{cczDV@T@3d?VED6*8yXj_OS#>f)tXWB`Ag_I6|^H{BkSw&o=iC@oTmCNUrPHx0rlUm3!Grs zhGfjgsIh!9;$a|d2~a|%Ts#QqP6Y>7q~&=v5TS~%gM1VJF*gS4TjVj8pHihip2HBe zf9A?%lMF@+Jg`OoZvGS`*bI+pf1F7bmFS+D7+#JEa6i5&H_x)xKH>l8PQDfADqM2X zl5K0<+dDUYVj4&8kD;|&TFOA~{1^}n7WmJ~MoUQAPI!Of-`qkx z-xK${BGdo0jdApO>(B;^7aCoY?$sL9s~AQB7aj&c0HJ6U!B{8E{y|zikYNNzH#-QL zM`tr}aY27#9`Dg9e>v)Ex2@s&a?1g=auIS%_J_hurI^2LcLU z4)GR%bRN4<7dBm8{2jEfp}8i1Fj;~kYkpX-TbOVfl^r$)2)0J#CD!B#7g)u&{@hdf zC=yePmP3(r3*V4sMH>S?_R91dbF_B<@q2?!=~RDIIWy|+!+PDBZ8B6uznv3p&Yaog zqPpvTT!)u1nN8a}?R>f~-tPmDDk?B>fDq5$Fs(@nmd16; zXg{g#$_cx(!kY=>{ZnaGJ-zw^U0BI9%Cl%fKxGg&Z*kVBDNUUckP7`O!w)&UIg@2){49xNqo7BNNiIEC+#RzL73D8Ke zE}l)?uevqcf*@)`x}0n-Bpo(h28xa~I&`Sgu2x2w`j_-&rAt;dxAwt^UfbL*Sa4aU zoF{q}wEd(=@yY6_Q2IzYwv||uRDHn2AiUfiU9%RM>`KE;{o7btt$()9cR-`d6Hu;T zaz6{0&R%H44IA=Q6(}rQ$3(p?Ly2vm#kq>h7wqHiE%5V{>g>RLs8Bk!LCdFt!o|+M z73spE77}DRsB&acYC66O@>Xp8*uE!OWJt6V9jTygsWzGHNUs8TJsl9RZSf{W zsJ7ZdIi^40FOgcQ#!`~Wdi5bc>YPDQWr;4#?9kv%4FYWTO@q>_G-|Q&y@$OgYgUKT z{I+U%)4c@%t8@^eJQgY+D*PT0zX(vllVl-Mgvz;AERV!BGz*5HdfsI9qHI7NuH(K0 zKW`A8Ba#br&5TRAq-v?@2erHqO-S^%YH#|3P|k@ zCt8xc^gI)_G8si0i%Z&461YOBO)1DM3dXG=S5QiuuTVNSt~>SQ9S^g>7+=6HfLWPhrZlnE$W%4-sc9~7 zpXuhJ46@9$CpM~EJZBTr&OE1606C1XL)D7hhuJgj2yYGKZZvStN|$;8ki!!3HJ|Jx z>jQI>qigG%VjQ9UR;oo4F*HhfjDv)cl#{1Fwrf68M%s*V$*VdaCDUS(tK`f=_O1AH zPRR%K8cB4HJu+?bssHUc-(!N>8s!n7+@tCf#|^S*ES|s=0x4M3y}~B9Z1^xMEFydyD9QXve9Jq3&lD-Al+SHzc`< z{7&8epY7w@d)#AWyBGnF7piQ+<@dD>NmE#J%S@9a;S@Yw?TyvTvz;Z({laXY+nX%B zcs{t^TbIy&(8#1V){%SldFx>Hz8DSl18(D{GMa(AFQy=x;v=qYrGB5twayLh$1e(1 zYIK7nNM`gqLPxm)RT7qfC=P>OVKcuFL#($kE9FJS9WDCDEteDNEzC)`cxwMtSA7bp zJZqnGE~QeE_d*N6WkW?vpna7ugIW@H(BfVqI_Hy}4q<=Yn5C?>C(<9=MET>^egLjVb+WG2;;ZYV9E#dMZ11zo&?uZa02C!C6CaXxk?!Y|5% zk=p4$rMIDi++AQz$AoK&O^R#^gBV{%vro&X5|>oshQq4z{1nit3O7eac-ZJAUD-az z4|ISY92CEEg4Y-i@893YyPFN34E<++Z-<`=;d1++{{ty4kKpI(g-V9(B)QBZCaKSpvFJ2cSeX;p&PY}&B~TH}m=iE<0u zU3pD5`8rGWlx^Z@bX2XU9S^Ks6B5!~MKdD{Vck`}6urt`?4Q%~H1RaU&DZyL^Y@N? zPw-UeI<|yoBgCA3k?&Q#f=rtl@sBb=R`u-EhvYQ-pZ_h~bRinDYS`GR71p$nNwX#d zj0DN=-sxfJmkN^Knz|$w{K{_{nv4ZgCnTpFSRFm0BP2Kpr@uHO)7_@=A!mM(_rB9? zp+&nJ#X{r zhVnUBsBG{5082r%zIg1!i}0{ATk=vSqILBRub`_Vt(fqX$=!_>Dz&{(Q1LYr;45Kc z_X>D^gF+rJf#Y&?mH11OtKpvs)$8t8^0X7FYD@NBS@eA;OVjj9x_u<2v(%Pk{{XSu z#na`<=J<{-UZWmAyFAx}(|ixC>J_aQ82O8hm|E%kI4{{XlC$F}6;?oHp3 zzLs}m({ah?Z#yolmip7epW)83Kg;s9fA~#*Q;(?V_4-Fz`ZLo10OYavKB+rT1IJbN zI6uz^ye6$PUYie<(Q)eYm+whm8Dl1W2V3wRE~e+w){d|L0E+(rEWNxRKR8cEQc#>+ zCl^gMlaD?;xbK&L7cM-rz^6lSPA`F$6BBCbNV>splcm<{HKV1Y7pbW%B#|8*DQoIO zPfjjUlcbj?+M!wi7x{e=)5FDiFXZ9sdFKT2=PT*H7w~SM;E_&h zJx^O%lgwf5>U&=d=rukouIH&Xv}2j-KiPVm9Vbsduc(HOo@X~!{{VCAbm6DdXve3~ z#+*6-08{0j=MNOWFA?%xS3Xncysz~C0N;|alr*%XqoWn4qaC8ZcjPJVO+1A=J6esQcI9%y{<2e{0mFs z@Se9%80mGfR?=UWSN+e7)Qq%eC{8Xji>99k=n>Ru+H}^;^FI-MDSS(({wql+^%4BC zuk#$-yj|0~A8$*f>TeyKdHVT&U-bC&=vSz=+?2bMadw^4OfiI|c%#pK4{Z61)Na=X zQozyEidNs)DaJc3j2oXIUC(6O8EML$FS(YZXb(}va=lIAyp?FquF!r=ysx+xqw`@? zen8$#v}CPe{Y}|C889ic0*5W4fvx* z`d*pW`Je1QGs=8<_VZ(ZSINgphWSTidVD+%x@+LO*Z7g=y)QyhW~dA9Td+kBP-$t9!rhjR%t%DEA%Ul)vaFZb!*+s# zp1=+8HC5nNfFc;H7CExoQM6$6I(k-CIv03l^fZ$@`hJtTvA>|U>CJgO>E=F}(62_k zp4_?`PX{FWeef*HY5YxiuRF5@?!C^vO+MQ>ry8_6xaG8*yGYAY?Tx7F&S}b!mDP?r zY0QM@R&7bUXFT;cC%0BOjOA8FQv|1WNz2rguAFf+r(~SB1JvA`mKc_=F&6SCmLBVS zi+8a#BnIsRV_BQP4qTu$YJy-6%GDEml+CewFe&0qHY0(4!!0Llo{utfJvQ!jUFPqsST;SXcLK?&@0$mH;%wcjcVHK}KJ}1yiLue|ED~;n z@4zftX$;=r)ztY~RsLpZwG`(qk;y$rIkwp@O#3nX>G8*OF4L`q#(#5P{QJxxVMb{=VwdS^YnRdiuk_g%KrcY=fj62 z)=~9S>2&pA^?G@!#oZ*%9Z$%q;$G*8)AhRDB-FIE9DJ@H(Dd|w5ozkB9;-_$c|}_H zK8KI(9+#>7e{(PC{{T*Jfyu|~%>JP(R-fIHlBr>)cKoiNsEeM4s+I9}&V5drakp3O zQ$8%D-19##CdVo2x#zd9?oFrYy^2l_FDa(HqIK(!Cl+28fwC8F2H*=~M=RO#EmzcT zC|A$!Owg!SHP+}EcUkr(XbTC@tg6zNiuHU2>Bb86CX)5!(~m1Q+lVN(>3)SHp^KBG zOH<++T1l-n-u&!v>vdY1?e|KTgmUtA96Vn>>-l>AYU74keonn^x*7?`NhwRu2cM~{ zEm=89w#9q}?9U^csLz|mUcQc;aG3fjjANBpz@V7IR)CUM{{SpCxEH7^0zooBRlphO zp^{bzrL$y~S9K^cz2XPF!c4>*6 ztPVn_f80J>M?K4C)`d~FUQC_jC`J|b87sb6BD3UpV)8tjB^buH8DjWATMV776`m3p z4;I~uf}IZvb?!3ziaqv^2r=D-P!~8FE{B9}-x~#N5Y>i4GD&Wa!M|rp+&M* zJWT5&r-q5ANso2zQWA<-W5wDMF8zaaG$xdb-1I&V@YnGTcih}`VVTK(-shbgdu8x_ ze@D}Ul37I-cvMEhM1`sKP3gR>=iA-vpDiGHCXm z9+lZKl<~{Qh(dpJZ<@uk5 z$>dxt&*A*u<~)-wKZ){vFX4WHbbUMP^%D8IpO-~G7cBJL?%j#2s~Jf`3bf$6BE1li zo+$RQ#&P2@pC`@dmRz}9^7+1-@aB)o>GgW2yr0X3{;c%Wvh!Yy=IP`7KS$GOtaiak z`@D{)N3n)IxXAg=PrseX(4~OJce^3omywjaL!^6GjQ0wgvOW0VDp&z~S5lz&5R9xU zR+{7*FKWtGw-0}*6)aT-F6`PbYQ6S8gYLLX5Ss0O+>BRl`5U^!CWBk_`HzltOG;DM zQT*|jW~%k_c;7MkKELA8i|aohmcYEz;$MqUdr`DdFu_(GczHB>k@cJ&3KKwO( zvUxJCw?zBQrD>eb?I^ZlN?G(0T9|1&^%gSoVA#mAcnWq&OM41?nY68iJ4DvwC%Lv= zDHmSDC+bccvEr`6RU-XzQZuzpStxQkTiatoST99S`C3ey)07)c7K-$uiK!})i``?H zD&Tmp7h}(-amsduiUV(cl!m0DtAeo9Pk8-_MJBAIQ=r7ImV=DB*sLO-Cp=?iV--Wk zJ#@oQn@p@=x9-6RLb6gS$B19m)d;~Y(P%g;t7kMLOUcov8_xr2&6bvg-f1LO5Od1} zA@(|93}h}$uDu4FIHLM`V`;+u&W$}Gqn9kpr=(Z$9+mXHGWGt2^t5fI#EiNSfH}k4~b5&y(o)c=+w}UPQVz6zy-78J z`VCzwi+QR%?x#+>zhN=T+UvN?W9Rj>dvEq<9O3#Nr%?^gDaBJd@$`ht%ZcfMY5E;K zrcuD!TfHbkhf%=lEpXUrhe6z*Z=f2${y_P`npF4}tg8}*Jf)0s&YcC8LMwBlr&;|& z3zhKndT3rhQ`hM9(npumJfqg=+P^|Po}OM=S(CC|I_>p5{-;8lw0in~$Z~Zsw9Z^E zt8!h^-lSg4o1+w@x1utF?Jp`NB&%|EFO73gO*HUx&rf?hWVfPHj>Iy;I&sR! zpFKah&p3Kf=*}DRb82aC&Af# zCk@@WEL#V51lja%>I0C8?gzHw_Y8;by9dn0awl*czToaO#OidOK&4&TCgou6!|*R~ z_NeEL&GS7;CaJ0x#qJ)}d-4wQZd4BJ1Gsxs?)5i$F5oF%;O-vPdw`vi?(hXHP`$&Y zdzMYzf?eC0PLMV_Q@am<>ATC=l6}p)q)%I@wc8ve$S!jk-9}@-2G-W^Z7<~_<|X+R z(ZQB?E4sADQ%X5*EsNX-Hi_)=9kC?t!Q9xcLeogi-O{gea&|Lzn3(?nj7oS4ZZ6ZO zM4=-*lXxsJjNy!=E=NC*#X&W<=5BD)E8)sFKBu zos^lEO2&0~v6Px*lNz|-tj#?vre!ViNjf$L?=F__HS>f@_`vBuAny$g?iH0lRqkZ) z#oHP@jJ-bMC4u9SiYsu%U#JqlLG=cHCJX&6ZuYN>BA>j_T8ib9F7wSAEGJb4$J3?Lp zpWP1#s=(2B$vC@AXuMZ};S^X3Xh`9iF{Lh^kHGX+zr?g6^A!8v(sw`a}% z8~*_H?MLHITORtBPj91|;@{T1Ua!w4zL8Y$7`jB0`V9$S?QrQxyai5)+Clo5x=~4{ z6za)cSW^gTRVup*fAmT+v@(|VZIelSS50gDD_SovO{u5)Kirq#{U4VOv#Wch^5gFJ zFV(u}I=}w_gCd^itK9?wnO_(I~yg zgu7)KcxdU4Ek4&?ZEH)?m*^~Imyvavdae0M{m`q>_bem4u$($`A9WNFuwd;b6&Rio2KZ{~lg;`~EP=6p8) z0Q`E1{mveFzUlfsPLlS_Z|nQKYf9hj3vT#Be5ULxN&B8|p4Q@Krpm1?&{mt+8f~Xk zhgd=RbQKQ>+R=6pW2Jz0(hO4PaKJQh*zxzFVmwk=+{x3$V0G$+jje}EI1EnHM0l$N zRg{crWMr*08&`}PeLs4*{ZL~cs%3PoT?RyL*O=x}t~Mzc-=Wbx6*b)*$s`>&cHqHp zjIywZsT7FPC28ZaT{!L}V`a3XNNDHEucsUxI&fLwj+9e6bfcV^$DLb7Cr+Fff_iDR zb!h2iJ8|W9eLXum^mJP`hKcBCXwnkrq~{%@(e&NgkyXkY@dOv~nsHD0VYiH)kHfTo z$4|yjH{!GTzY*7M+KcU1#S!k^boBgka_{LJx>{*3_A03+D)bg|X)wvRp`R`|C9O3~ z^17++j_q4%qmFtlv!@IsaAnl@c#kVmJNY?fqLa=5>qiXqHJZyfbt&1?jV>N5&DMomJnd-idb+W@I5ps@j`X;)c{=gSICT{! zdV27~I5lEJDE2tAaL;3&Zk3%{k=>lLTb!9a91xSC9Qd%$1e?P-?R8^3Eg6pqZgWOd zJY`&(R=B!jEDnf4of>|nCE7Q^p&NbP>uNQg)d)w*yJHdB~0M$<^_MmRI&CJSwrI)zFx>C0i0bgqCc3YWx#?gyV*CXM?86t@py&3m)Es!d2xeF}D82JFRHXC1Ayp2FpqdU)Vf3~UdF zMpSaw3|}RCH^Dl=D~*SgoG?Cfu-jjtsFIMik8dL0Lh-!>1!0n6w04f#fX}zrtx3~$}FSs!` z)3trFzd}-jj_ISMH^%GKo#V#(@M)ECnVl2SQp|At5OHyI_c`*y+~8g$UKae{sRkHDjh09rIF&k!$OK*m6-*8fkQ&HUAK+=6j&B2*+{L~TxW#qL@Ryv zFndZ8ieXBxCXXm(hA~DrUgIU;2~rN@lv2;I)CGaAta;>=cnlWciv2hpdJI8Iy~eBo z20V=kMmsV0i(UneEe#y;W5NPWj4u>0BN{9#Z0syX9u}K{qp*(J8as^%PMug+ffi87 zk12F@x1dv`#ax9ysM425jD}LSPA>yT0~1On8&pm?eg+y+y>G*_QTU8w{KuLBMqQ z@D#*P$Wt+NqIMY2k#&v+UWO^C!ly}xa}!DR@=^GAStqy4?fSeOy)y0iS3tl0(r1hD z{-fn|T6zioZAafP{wrhH>80QBuZOj_%CEBr9$VzfeI)(IlN&g(zgvH07TbkA#7sB2 zcQ&70(`x?!5zzGdzF?yL)(Wh7JfFk8SAL$aNhhD@)A!{bs&A z#X1RN!0I>dG+Vp4)!jk`3c2| z*fWv9wCHHYzufD6J#Z(u0c1`i3>Tn~KABbZM$Y zA(YGMt=L@oIyBPyomxI=9J+WrG;{YemoF~9o+^&r7}hXyX)pRa`gqg!WUVB|J9HyR z?$CwDZ>i1G>7Duz^di}1F^>NLhoz^dsjBvh{g0hjt2xc($+wf}ejxtf^e3y71idwWEf5 zy6by5HKVyY^*FM5nvugfH6nT%s|@6vFwR_~)#J&*sIbUM9eT0f^*N;-&P=1b3$&Zh zu+Vqx28N0zx5<4htQ}fQ$<3o2(c7f3R~IIAeI!~glO-8a@)bNZRyeHMo!5RvZjhb- z0AM-#nWSdyo89ad$+v-3#shz$IXl2yiArScTNqg~P3|+K+wx9Q!zXK_7)I{NN!^Uz z8YeB^kt*22x0X(B`5C?l$*hRJFdMRM<-a36os(@MYe-hrKh&G&BQ{C85qv@Wh}dN5 z2*kBW4gOZi$KElK{$YD5rIj&X)T2;a%?R~0)$&fsJ=4!6{XnCBfO_dHB2v_puRmf}lL`5rV^wmD z6Sr)XwVT4i5-Wcpt08$Z%f#@ck_9&XLl`#MNNJVR)59yr#jv?)IKu-d7Eq=Y9QZr1 z;gK%nyD)Cr{^ft5we>4F;B1|{*qyg!n&yRQUxy7U4mY@t6}=r86~_+Fe7K?Iak$ms zl%s>PP~42*aA(D(@ve4~^kTh=G}VaJS;uCTl)M333stZ=WXv01pkoI)cBPQQ4sz{V zv#Jq}jC*3U%PYmj-{$%YmWd5G=->ILJ9F-m}jSH=+1 z7P9?@NDImxWqSmmmA~jV_62BUtzn_cFjkrwFBmjd16!e?St<;0jFsmBNsS0-EyqiI z0t<99D?Jjj8mtTKGAgU`m2CB^1Vv;9qdAa6BtKHWicyy9{w?SRWx+V=RiXk(R?i6!;lhv10HW%?wk= z9E4QejJ6<#LanTNKli(~^{1jFYt22Tu_dYc`^gfU9hft=vu95!$o-0xw=;G-4E#~w7r(ajc zJ`a!d>-#;8`3zq+B6WbKmnX3CwCL%z=hN!LQ%+SlyGPXNYs0J1k5Q-mvc#AAS@JP< zuy%Ym;uH9OuX0`5Z~5T)M_&goW!3duT>L*0ZhMcVjF?og{RGmUpHZdrv?brB_guyJ zW=|)k@+|tSq&A(s$wpuC7SmL+gC@yO9OBz$p%rYL6;oy5AJnA9&uOBENw4l`E_p4} zbh@2GY7uY4;CYYAA#S|VMKP!69 z>~i&*u3Cy6&CFYge`yeNcsAQ8(5$xmt z0BXJbzwiE#SK)mrCgavc`ZOc_DX#wjlUq)C_A3Qm3TetwPqnq|!P&?D(tJ*7>o4f@ zwSEKFXeZsE$e-<+SkCKclah9KQKAv9$_iz}QbScThzfb*e$qcx%$I6&> zSZ8&;U(MwFib6dFTUpr{*`Atew>j)|O!V_*qgRK3c6Ot_T3f2WQWDZ?@xeP5$33~0 z(RBGO3R@C^T{dFm=+byQG+Jq9-QePbI`lBX@^ab*? zJCnxeS9S6$*xOSZW60O(F7bwWT~A9_NcwGEG}FPs)O5=@8f5f1d9?X`Z3h#YO04%f zo|3Nzm(*!?wo+HK#mO>`Wg($Fh~v1u!F20x%_-pN)17j8`g83s3FB}%^2OWTX^P}d zGqk|vfN3d&r;vROOzwm9{2n3dng^Yvr7$EdkG^?9?8 zQ4q=Lan}^%X`Hi;EbY`=oU>nJlPL6f>z=a8X-9B&?pIDEq*~t#X+-IYr9||gspPKc zq>fCk#@g5x^2N$Ccz@Jn^lspHP?v#Rv$g@VcAd-q#B;aoBc2{aa^J|CJjBjqTjTXJ zkd8uad}e{VU(l4AZ+(L)TPG)mC0iI-$VV!_CT-=mN>ZY0;{sBkw) zHSRCeMImIjA*mZoyL=Ot%$`$mOnf-?7UUbNRCVe_TRCSF&(1pVsXjy*^J3Y`=zuFo zK6w`R@FC$^6^`)5;fiQhh2U={dofK2mf(Dbw-iIdzxcpATnH(lTHOJw8k+#RG^Ap^ zw9w;impTHI4Y(+6nPkZ}Bi$)Oq*ulpz~5YUg<+>Jm{ z-^e7{qa;!hZR9YHOKIu)9h_WyPUO(jD51ddjol4ZX&$Z|azrjfQK2c>N)@7-2}@pr zINQlxzt~o-Sca63Es8xLHGxeD&cd`k1Gmtbl4}piIYW9b(2Z}o9P!$cxhDZDxjr}#*i5dvFr%)7~y-2Q5i4G?gWNkpv7gl+wLku4GJqQ;B~OEYa=gk!qJLU z9n6fCj|wruV?+s1(d1}DM|L*rkyZz<%SAEtO393s@&vMimjwuF3_!3l+-L$c1w$o6 z!V32a`vYN>U9sUtJ2pCd3Y8$N20|HZ6|(?WBNm9!;0tioMU4s+80P!|ECm8FxETt* z<1e7a81fW>5XE|oQ!Mf_*jVz0SX&JUD;}sRVS#6VxK-q6Q|=h7KLW=gPKJfB$kK_8^20$9ga^eg z01J`HulR>UO4f#ywPe4|sfG4FcEf*AW!7?E!z65aJSV%iPg&RN_0sOvo0o{JCG3a+ zIs$%&9m?f*m32&JGg2K(2S>wt*?d2&(&{4frzHK?CoSMRFF@m!#_k4K%%zv+`|Wue&@N;{A;J`ajzfY^*_}d#s2_f z=N7}mKTZygE?l_$Pfl)L963F{&r3_@r7bzfRz6_tvV-u`^*&dlZ%y|`PA|%IdRiY7 z>h#t%=U%xzK0bM8nDTi#e5KU8d)jeSbZKc$a_xj1tn#`oUc0Q7M_NiNc~-}%^VWnr zBRNi7%1?8*j?AY1PdAerjn~cH4wpluN?lH(a{mBCGA6&pC#e?=6tr~z0QT;A%TdbP z%Vvw?^eJ8!xx9>N)K|0TcwxiMNJ+pMLA1oT{E|`%cgS{4DcwP`YE*9HY&3f}e&qYN*@L-NgJY#TlSHQk)4{u{ z@&zr;vq`5OzfWn>Jf5$n?X&1)tx>_$=q8>AmD$6~Wqh{2l{RuTdtGNwP2lo%q1$C8 zd)!&fp8f zgY_nOKv4B;J(uWi+ec}3fUjdWX81Q{8B%)-Sn^fJ0=VNM_R*Cm^cJ@%+AVq$u}M?d z4SJ7C#S=$`@-1WBWzPU>7!yV%AXXT{@Ws)fY@dM|DR>sWMKq+Uz?Hd5-#d!Xr`ZK) zr6EPpr-H18D-08oP9*miB0_ldo(>_>=lXBkDX@k@r+}q_ z;YD&afhF(YBg#`pW)ll+n}b zG&L5cn{b?6rk=-dPtBJN^|^hxx%hGB$KI^!x(<$gR;*zhCA;u@ueU=_AZvh?w}xh(s* z`&;HmP9G~v^2KtwCv=IaQ`l&|?Cq~Rw@NQ@<17+a#{`Hx1bnZHNm-@UM*4?)5`6ZT8c#V!5^G=`F)O4$oalp~_Ayld-hEh3RNhUJqaZ<5G zf{BugvEbfp1ga-RAjzj}cxLDcRkZPo!AN?Og0+&`ctW914om5)WZdi^@91IOpjejS=Wm)!2qlF-wZuB9ZE+wgOA z+I_3$PPf9SE%TVp5X2>vjvpiK&ND_1~Nt-)#Ez#UPn??@^h(B>F#1&S5n83<34>( zbtH#U!IQCdJY*_lRJX~LtNn~#)%)w5gTKKgE=}Cl4WR8)zaZ|SUEG1o)EXYuT+m}I z5c!*$GP7uVT``{zVJ8&g?uApp++~;~)6DBMZv77rtJ16ReLqnfOz}G16qEEGSEtiw zuMY}KED@DiO?dXV?sMHS-qt>2qBHdwY8>&HR;7QrgSBToGHzBcb~h&}U$8c5i%Lf} zq^`(4UZddFM;fva;my>sWSsw4GRGvYx?NPfDT+kDw4gfL|?!;_& znCoUr_ZWFoQyCi%5va3r0I zrYXyjI4LhuO$fA4Zb5i_h2gOpZBaF08?~Hz33ReE5=cd0c^843q$dI%7F)4i<4NF4 zbY&o3J%n$7i+-XWK$kQ_QqpDH{Rrx8OEqzF$r5q&EhSfE>%r$`Ji4c%sNiJ`4;WbS zg(30d+g!Ag(+|t!ykkh+r$#(P?n~vW0)-X;{{RjK&~VSFk4}!4$UAK@ZyYqq$t^sR zlo{CIN^rwD^5Rxx|3)8 z4mDzSQ%a9+Hx=gFD&zDK#;i*z<=Slu`N>qb5voi>%1yk`9n&44IMBK@Dpp%gI42#; z=|sN{K1-EfNnovg#nM=1Yx2?b99Z~q<$R{%>u@!OiYVdHoJ!n6RC`~zJ8#Ke%i{*^ zu{&wDg)FNBjUwHdH_P3N*-a~*#hS49qOVS@R|Y3#G|3i_J82f|7qc9F3HBaTTB{W* zMOAH#*-sB@5#|rBaOP=$Y+k>@uhL?(u(Eel$Q2&>#xo9Ii#w^<;S+` z=xi?hquaeOHIG5uaKT3&m6bYGn+;$uoPb*lKvqWjKt6p_Cf2e4(pw zZp9cI8pA;C;0(#oQy0mNvuInkYxNbkTL9Z_AL`P6iK+FG#biR*QwSc8Zbo)P}$NvD;{O$hn&w2T8`oCuv{{W*< zr`gs)zgW>dPs1HtQ+jgK)?fQ%dP@wVZDlrrm)YGOU+CBAZ~W{hKP>tG07uR0^gTyN z-_FsTE0(eMCZ7JM*Xi|IuwAyNAN0#8=GXXlMbG$#j)8YcEnO}(A(U}N9v3GMCk9=dlU3P{c;`E@yE0Z7=D~Cn zs7S_(GE@#w-$9{8JPa&(@-n)}(6nRj6b1QKP2G2}N-I9Wpe=)DfH4X&g8;#cX)s4% z`QTz1Wd^NZfGxKV(G37sAzxreb{``Y$SVTHg(bknHP}TOF3@%wGJCLs5SFBrV!Nc> zB#(Ec_#U2`QtBI={{YgRBy@3b=gofV9GtlE&%E%{@D+r8Lg>0>4&RZdOaB0A$<+K4 zM^#Da{{V$QALVCeT@NNRa_!BJRfW20Fa@xT5-RPfHO=za=rk-#5Z{DLo~p(@sk2ky!M)asFvvqBGT( z&=y)_j85FD(fM#rqJp)XU&=u`h;P(+mc0|TZ<{RT1Lnw@VMyK7J7NB8t8>-(Z{iN8 zq=M7buA@i&6Wx0=$mFh?wp)vnK0LRL(mb4a=QWhu?D`*x^j%u~x{pGC=+xWpdfh)s zDM@z4PTHpzX!t&!IP!hJ;GTuWYIWL@Yfe9w3h>{P>AD_Vx{T%-PvZH`vx^=KE_m0| z^!gF#dViM}`Q@1~Wt^|9)Rf!rtKx@UUZVd1GW#D(a>LYo-)3I#w?uqa2aH-)@Sl^H z_=&ZdG)_@-SKQ_9CCYq*vfmcFrLU!@buRgGmc(^Bsp~4lW8oa}O=5!=f)_hlamb=? zVc_oUpBWun;F!~=R)$W*k0V40sTV^iC^lT7HKfq%zM&YSZv>>qf0|a@WxD*Dm+y75W*fZy=6271FGB zV@Cok4Hr#?I_XQhMn(EaTO*>s!;#t0!O7Ci_zZIAbt}{9BaEKMOQ5@Z^)VRa0t@y0^r`r$7rF(hzHl8)dE^M`rudA!#Uln~rdU|fOm+E=SSYjzvo4){c z;m0tV#QnlbcoEBSd%mVtVs7V?DL*9C@MQ9BA4;iE(QC;V%Y2NawlQ?Fmi&zwZbmQu zA>#P~E-S`Lf|(^Dl(5X6lvD7-+{pJEzXlG~d%aEHMAOHSTc+}1?N_@DUhk-iUZArN zY5VXrXSo~n9T~K|WHObIjFTEH3HF|Oyq<4a3r~~3yTQ%WM&ia-i^Y8BR~)_%I&UoY zddOj(Hm(~E-$TK72&Y4LS|Qz^aH-H;U8?tQk!35gef4~b<-SGOb?bux#=x-WbmLA$DZ_O|k7=OK{%gV=Kk}rcLK24Je)&IXp1i zthy%N;Mt@JY)y{d89U91RmC|=bV^li6qEJbl(B3|z9nMahv|VN=vu4`66)An@Fn0) zsUtURL7yT$g*+olg?Sl@?V&1>87;&qC5OP0Csu@eh}~H42u321uhVuVjY2)esz73m zBk)vxD_hc zYX-@Wpey}N#tgG&29E(N0|~16HkcAjM++*p1tWIsWzrJUbV^!#osJ?nZbvR72UL(w$-Mf=%olZ7M#*R$5 z^sYG|;x7!Vg<#d;8Z(#hZPx=@6euFJPL$YwE-sW0PNZ&1I2S>}R*v?f$)vo=9C&&SqEX!+lDW0Ax{XBs)V z@$*!|_(rkn2l}DftMnIp%^Wr_2;*3wRS!*zS7h{QO4j1mp?=)hp40d&k|$)4Z<$5N~Xpeynk z5dlh;0=IYsb7Li03}I9r7^5aJMP&tY197-vX_W*EAwvTsJV1iIMuiBh4l3Mjg8)}P z108_58_2~N@)QWGu|D+6z_;Ds zsJ?we9rN@)x?df$#Ga(}9$)5fBS#{Q8_$CjP{>u!py^TxS!V;Uabvj2S&C$8vn_(X zj7qMKytLCxFl#Y;GmEeIBs!Q&TcTaMi!#vj?fs6pszYhX#$C~L)7=Zn$A>;250-9! zS^9tOgB-HL?+3~>(`n)C)7)q;sq|kI_*8x;r!9RL_VsaJnk#KZ{m+|NwX;4ys_Ap- zGwr@*^?twi^?JNqvzHyuXRHnV39CpeV~$mHqIGX}6({T>_Mq@K$}!oDm4Yh)PJ&Y= z7=Z>Mg%ykh3t;Ys0gK=}3Z6rn+-Os$N#rrTxfN^}?_mR8;fuAnp^K{wDT08qj1toz ztT9s#!vos*2Tq^N*J}HJEPtu&rkUmZ25MatlHN1V{Q4e>!SwwslZPEVK7HOxv)u(t z>L70($5WqAFXQ?b4Lx+T{F3$Xc*_l*_r@l_^7$vsl2&+{8a?Z}R-$+vULX0s@6GG< z*?;5n@@+jiYPZ|5)u#w(s#%wiInwQp!jY0ae=lP9`CSIv@a%3 zpOC=O)&i*tygUUk!kv1Vcok#)#^cC9(B$aRS9u{C!PB6yR|IoM1I*N?>q&f;+!bk(M+1i)P8_ zu<`nj95!bPwt*FPA$^^0JXhF6$|q<97~^u0e!?WVDGyOn9GzuAQ;*-pF;MBBN~h92 zx9Ip^O{#9{ZM8bzWImI5BNiXxyaFBK%3z< z|8U~1A%CpI`Wcg2`}$W0ALZMNI*{9~{GekM57`)Sm+)Lu6LxF+)5=&T%Vxtb%$VWT z*KG+h4Tw^Uil9+0%!ZgbQitd%PTG1N=S4!^xP@|`n{<+>awxz7Z7bS$sCNI6h6KRv z#8hqqQvFK_?&?|lG3k5eKv(<(#)h`+TX*A@07>xD>;ZpZo1dfd5}UR40qCVf?r$*@ zM#3QLGh!{N;GtZs>xkAdZmqV5C)R(zQ+{diEf3vP$A`SSj#PAa!B0QN_DNOJCGBR! zpWEU%w;D7mcnx`>xpvLX?#*I|oe|EeJUsG&G5z?GCw)EDygx_k4*Pnrt z6~-eI1#B77(OiS*rYW)$BujGqW8t9A;nRisWcc(IeWsHK`0jhA7K~6?H(P&P>1$R$ zua#IwZoNR>g&1eCmffU}1K&M0fnFT%@_tt$@gCKv!A8!OyUT&%rs)|#{;v~_^!({O zL!6cvfbiDRl;>MzO4Y56qECZ*!I1$7PhJSMg5g0w;Wo#wB*9_Inn~Idzf=kz#Z7y~ z-=0(tvNL)%gzopG8GY(@NTroMkGq(~>?~ zI{Mn7Uykrffdm_)7V3i5tVSCt#iL#cR)ms-?k}70|KWXtQ#%oA-}tYXOi0rwQ+@OD zo++LJ#xezJlW*Iq8-ibqh!iOx496sKQY})MQeCngtMRL`XO=p&ZUSsZ@mD0VPaAs4 ziKBz+s1I|*6e}-?sz(I#Ea>aLIHsni)=|(zMG`3(8hog}kE|Zkx1V;l3%{Ba^&5Zb zV6El5hfc|4glwq4;In)Vc-9^Gt_KE{aa#xMPn+9KhnIP6I#VQg=D~ z;rxxU*j7_eo6GnMal+NfyJqmxjWato&-7_^Z1y@saj`W6TP`;(M3I z9iM*mOrOq!ug32=yi9xMlJhqWtq|ICH?gBKLD@{Lm@YLiKwQ<|sA)vlt~Bb$#H{;m zg~#sZZmU+P;?;WFqBw)fZlGOK9#vw8=aMRS*oem9$pvwF_LYO8mgARYfVcnq&z`T| zYx##rdlS-X3`Ye2dp?(xp9~jNRoqSTh zmp~y(XOwx|7HkTOw;y`a=|IM5-!~r@)Frio6POTkA@pYG35hc9rTh4b{^iK)7{Ac+ zFdTa5%+(u1uY?st5vyA_xCF;j(9F|v5b8YgUcKlzWn>?pc_*Kc8;Wi8%foB8kx&n zexEuTnZPhR@9sZsFwcA5u?NYMnXD}E=2mwe{P!#$A0Va)qvv`sOQy%Zz?QfUy4>H& zjEWs5CY@aR7)cHtcv_BIXYsz$y;$m&JY2&FpSAg{XMgj1Jmeq7q+<^q3|H^iGLv&q zY7lr+a1)d=l`=55J8YZ-0YQ5sl0)``h3t+4?)SNoCh7YtHtVHjwaOa4a4dL#lGc#F z*X`YX?fl=zkBNRsoHsWMe};^R5AKA$sZ2}a8# zqifxNMfgJKBMBma)bj^lUk(nnC)F6nFth&VSI@+L221vr5g&xBOrl6}bG~EE{Sdu) zWxv17V_ABMKPt++^s0Fhux0$`cTWSPt2V^1-+1+3oK6%Nxj!T&9*c^o$2wh9HiKZQ zVUV!NOA)mi54F(;p|21cEG&Nj%~{!GGrN0qY@?;t z5Xs%-YK99oWc&TCvvzHgOnB!|;-JUw=U&&_|6qJx^}YH90Hd;qO22%jUo0((OlbR9 z6Ev}+T~Vi7Rg%@DlIB30GBOYwX~-EXTOub)7*Q-$tP?lEKv&1i?y4&cBf_r9RUQZ# z-mh{uVB3)4(WD5hpEA|U=imomGs88(xk(?1W-oH|lo=d7ypv+*_N=qhid9AYCHgl5 z^Vq5*HaBk62SoyN1cyY%IB$K0{TPD9z{txM`H!5&iynyTF(6^fM5bLW^U=1*$h7S* zb!hh=JUqhRQCS()nqrBCOzcq4m9C_kEkF#l2J`cwAwvabsfBTZ?(2jb|6%Y3_$sjp zaTKIa3bq*cQ!>_N1_nB{lon3zzo{h^TUO#qxXVpanzujOK~LZ#QKDI0Ssh@{;x-tR z1{~LTtatd59cy(n0=7!(T?}l}FBx|~9D7?#mv3gZrl#v_t@SMFD9&G!DJLv4@XN(r z{fvTWDW@iUryZ-#j;i^3sna7AU@_+r0og8X0AvFidaMXugl zKb@vh4zh^j?7-EqT zHxMZinm?u)x9BD8b;5`0Ut+2?`akMxXs@1Wql*TP)<&*eLH3=E=#oO0?pAHNqk(sN zKRqJq#lHh6!CkoEv7^6%%ZA)O(V)z01=$mGa;fi=p!fPcm0@(`ul{luWD*NQtJ0GT zte)<3f3Anw%B|Q}ntlP>GTDpbFn7N$SFdf1q%zu;-DuIL`{3~l-OM*o`9?G(^MYt7%rcG52zKF8Ek&AN=zYax6Ay=C%{ zn08=f)9Y1Qe<}*6EQ9!;rgqg=71I^nI0^FrGjUpJ!y$TmyWgk6Zs zMTl!gnxZ(E9uk8HmlVw@N(Ts2iL*9T$u;$8=Lip-ygA$+FsF){8+r8oi)<@bfImDr z98v-ky_f0wsLQK&f$2{o_xTU&Qk0S4uz)J|yOctju|pnJeY;z};_VFwi7>h4Hs{g0 z4+_>bhaFzndchRYA8_R(1@~;4cQ(6M;0f6Fb9_7tSndLQT!kb~?uELzVox@cu=q}2 zu{Cf+4|$Eg-!8@TQ73>S$_qIdPu!SPKAoi=IU2;FDO=CBum5}<8G2*%wYf!o0akch z`1d~{p1w_=)Ov&RNN1ImOwekV>{4H_dj-8IWUpW0`dC$Z2Z`F4T&SJ(r@@_i+om;gXD%{8JT_@UichaPOUYzK-rD z?z8InNY#XoY`D3YTp!>|7REcDbAI4K3HQYNmasl+HEpm|#S%gFrE)Nsxk{&_$5Lx6 zMU6h0r1VMIJKX08hK-K;Y>G1N8sD0txPzaYlET?2t03Z1P|Sm2gcU{=wzXfX8$z;`Lv`nWYq=7UKIPN>59J54OY$FyAea;NhL(a1>g3xQwpE<8C#u8}}7S;*R& z(2da!)>{2n&1b0{&+NWuYOcYR^vu)h>2@z36qjnaY7X9MklE4g_oQacvYYG3C2O-h zY3i|_5^N|{5DfQ==kgP=>X}qBZR|(|leMpa{mG0ijQSsbd9M8^X4O{gp4357pZejf zyyQ5=E2oV$`%pebeKcB4+px`<7e_T z0E*js?+k-H-<2JsmRi+Y&!UA4l?lH-B4ym2B{W{uB#0t*`}$dWYyeqYP~^|&18cpq zg!)r6u+;?aM!%vmgc_n>ex=Gg1bb`1A!sE|g@$#WZROZd|LL@WwyC@3y*$oz=pSWO zj+B)P=d9^U1(L7lDZe&#RSTO9eXMOt6%w|l7q(mI)AiFKrW)4SYQ}ZbH?!+vv6G9# z)fTC`j05LL-wL4nO#JMRrAa!nhoJjNy2;f5g7Rp-u7WQ)j(*PYav{ehij=jW#Ceq- z?*uMQqMBaL*BAl|P1l#ZD;ei>w#Oj0h3O+>R|2qGge#IO8QpSvntNpb^9hP#U3i1& zHDNx3t8gzH`pZvt@RdJPB24@?nB){41#p2Bhg6w9c-TzeVb2p?i-uCh_%Y}}IjelZ zjW4Rrf!Z?du(4Xri5KuVxT2w?bS<;u$HCeOZ*BnRiL=Fea|BRnYO{rD<$37qQAo|1 zeVI{_L&1-6ne&}>f&B+%y;vl;S1={(l5uH7=p1frL4QKO#KInR2DvgCXUk_{4S+`1M${RV{;ChtYnk0?W;6`~0j^!`*c@D)& zP>@UdQ9p56&M$NkHcdE8W_>E*@H?gNzT_CyfP3o%MHnl^Qp&lk&es1PIB100?+{$DC*P^s@;vJG z%#*>BTx9`cA9Y@@_oG=K6X+7YFCm)v z8Nnu@=cXr>gQ*zjkIjYc9Yu7M0+CzLP274f_5A~UE`4hM(x-t`prbC(1e7x?M_|`o zcjC}bSVt7mU9#ULaMT4bLpyWn2J#dui+_Ba&-s;@mirGQW95!MRaKXKELWf_Z{&Bj zkUD0-ok9PO8P*wk<(idE7IZFIKmb<)#uzdiipibt1AdC=JUnhgk5vuhPkI8?{^qUf z$u9p@0h2s>y4Yhu;Sj!9I6(_FDxNvX3YLjkE~LpQ$Y8G}7Df0WbNxPzn~Y*8OXQ3A zey)miepS)+wAq5WIErWC^}_oX`3cet4hh&;hE{SyJ(kh&4%|hIeSj=SDZJxFSpZhE z#szjl{!bF<65|qS1917q414%E^H({{Huz7_9rf-em0QNyV?v7_=X$%HpS;gRBv5;| zP$f6K4{XOi%a2R|m=DscZ+oEQ6WHa35z$(B&nAR_Z_S)Zk3Px*D74YJC%jW+L!8b4C0 z(vAObuKXi|$n=fN$8SsBTOB|_I`Q~TZx74l8f z6X-ng=?SK~DU=}v`S$Jrs{B#Q&x$>bzH(OlZ;8&1Z&s`6?snWtndwoF1EJNv3PdZT43y^_J`!s2^ML0?p!)fxC%ROh7M>}L>ER(*1H z0%d+=po+xT3$PA)=-Jh^Ju(EyoaNThzMO}w{)H4xlUc*sODf?xXr5eL(|H-Y))9Fz z6SNo=SD@OTJ*~mPlm1?yqJO$(81_}0V-OPqXG6O^DB-9v`fKj90mK~2;zo?K#&>bw zryZ6{qgCk#&SSj_bd}6}n|pr;KIuu#VFY>leseh(4Q5%x>B&J@80V@sDA=(QiN&s$ zSpq3n)6m2a9EZNSn4&n)PfKCVjyGUrQSK`x?M$q?EIU^7<3T^BRTWc|xVC^whLFaD|zo=46E0eSuRTfV$NRbLyPHYF{2Q`h-8~R-7ENh7tXl%XGEkf!Zks= zBa?OcRP#Tmim$+4EJs=*`0S1-Drck7`+A$o-@}D1^YzrYQok&{Dc8|m5)tySKU!gB zIx)5OBP6pRR>;^ps$r&qEJp5qiLX@Vk4 zFgoVd>|2Ybx*8TBD-|W}9mo^za0*b)jy-mNq57F{5|J&=`?HaZ-}u{hY!WMLDeA*m zuivzi9kTZFTj^lxJ_#Uu_h*#gJ(R)sQ-0He=HQ1leS|PR<1I@ur3B9Y5V0JeDXBO$ zX_VCI53<7%#gkqp1GXGo3!`WLFU6jLQ>)32M_r}OZR1_m1}>~p10Bb6m>=*T^YBX3 z4RO%v;lzj|;s5Hs`CQ8+7$T8~ERS8oC`NG@S{m;c z3J1Kd>p(|V-O{;~GNt(U)3kUPc9BsKrX~3IG)2Yg%2b5S=0rt$tjKnz0Th@-ti7q3 z!m_4K)tbw#WPXSj}b+_DIjJ z=zKH5O%awg`YEA-N)^eMd4B!2ZBfM!Bd9)lMO@|MEeGE+#u$AKP1XYw`H8+GaZ`Llo~fTMeRV&N9QR&VFh@Gj$i#_dupuc@Xz*yC<}DQvm6C<{6ADD&az0@KJ)g^j^S zBHO-j4RQi@EslPS9sQ>ZY;;oXB4k%Sud}?t6LlA_L#9-1Jme<^d8%3&3h;D7C z&w5c89qUhxJ##4m$-&#vAT=eHW>ibV5XwilxdWNbc#5Z1sHY=w+uY$!YwsFb_~(F3 z>}^s~!2D4(%MM~3PC z7NAYX3-CQGd8-d*Ykx1NbcNk>8r~^Q_`KF4wS-$1^h}dSyAC?_F*)m1B{l14;f3^o zdC}KpIld@mKFp7g5yPrK0s;6-`8?wyu2$gciz8=Nf9@%jLZ$-%MC7AJrMw%VE{N>?OJ%si$UvEXqbcyroTaax zN)Z4z}Xg!@m=#5)}W4!bKeETs_5tR?K#Jjf&6P4wA646*}}xF&IVQ^a%O8fc)I z&6%H%An0mhbw_o35^92WvY@Q#tuAX1VR|faml#n`V=@9j`O9(3!PzN6w?rf7E-i?s zz6>=TTt}ISV_1!WtJKwWz0>KuQ~N$nE>VMRZP4ZQnc3E3$&kv0Kl_)kRJ8Y?a*J1q zSbW`_1m0IBu#p@ddB3F}ub-AczkG*5RhF%0b^MZsA}AkLyCBPu(`P$1TZa(zVYOUu zYxXvuswG?LQTKL9iI7_LWV>z~SzKJ<%X;$xomWZX85Y92mXT?$2AzVyr&t$qfh z$Z{z(y=5tFN{K_(WJvruWcPLOjOFxHRy?m$zT}{6c1?9%8Ss3 z0#UNF>4}ArRGUt0QS@c?!20^bie7zM-!bSW#DIc;bmCMKt{k*;R9X|0j{?*9{S3-NAozX$$W+LBDKkef; zSWOi1TK&P$qt#D*>WU-vqw|!rr_QL~=&QBuV?m2cgXHap>IYo^iU8(lW_WF zDCK#RFJ6^(=RpKVX*JfG7foTy(C6K7LO_Tu3?4#)b`Rk!z zF!W5IVl)c~Zcfl%U=vU`6sz37d_C7Xp4MtUJMFP*zLR{4vcm+LX}(~dg>z+o_&s8| zRuRQ9?m*Ylt!}t~)mfgs)b1+iIG^U>xp_V`s)vIvn_t1dBClM)(_?x8q2u{j=xbnfyRaa1ny*g9tZd`CG~}OdCUiMe)9F8x4brSL>~)06UIE+WAg}c~__A(RiA{Ls z)M4&2nm#~;{ivCVbEE2KO^6B+3KmM9!zyM6+#l%4{@J5y|9MU)LDrkG?dw$3iO;t!~08yptO9wpOFL=1j z$($v!gNhI7eOU@S^1ez?Unp;y9!s@+Fd&C|7YWsVs_Fn5b)}#NGEy#b=);TH2aNRE zCy84`8Fcd0C6(>upz&w#bhhwUpWlCjh-J*_6cTNw#7w2lf3;azsNzm-peL=sz?No^ z)3_vOolAHxFd{_Gw)X_ANPwjRCF~qn5rpuue6|^JmMo7@apHG1?~B!5@F(uC#{sad zEyEeMy4^nomO{VW@K!zwZiE0b_uVPq&fG9Bn3AhNup3|ziVfRdC!INQaBvEXX1iSY z%UMH1SDqF&0;ruOCi1s$It2uGlK>Ac%8zlg(}~r z*biwQC_^%RrJi(6vW|kfu$0s&>H+V$b=o%cD-j#Z^w)7!gmKmgow!Qrf#2+@0jFXn zV%X`i5uGE_o?O0~1Snbo4wBU52MtodzetcwXNgkllufIoWw8Wm zv{$)MA0Kj+m9T+CUFUc0*GKAuz?PU1POfWzd1N5C`M%*;@{Hn-(trD*WJT*plXKIK zFt5#0p}m0-qb>r;GQ^4R1C8R9I^Iw$dOg5wAMK!O|8YcJjFLPv(aSU7;?%{&u9|WC z;7=9*457 zzc^zPb*XwqCZcyPN}VYqNe$7lFq~~t^@6=HNq+HJtNgpQM~rE_Zd<}gbwWNdSH9Ds zBfbs`WBM=@vN{T2&M(>}oL$a4&lO-*(Sp2l)1gR17Sc zw_Fg3o{p_5y9-1a-xBYQe+d3=&ExYW?V3K*?e2$CUL~P-J0PC$62410E^cj@RSc++ z-eY9^JzF%vRyp4fcP%v|U`m=hSlt;9M$dFd#QESC8m=TViH}v5=h3@)MIo=b`ZaVo zi4Rv-Qr(`Y6U|-u6TcxdsAelIy=nT@Y8eoal&-mDhwYbK#Lq8*34?~g2Ik9gGFhk20 z_Zp)DNBxx%(_#j`A!%Bd-&(`QwX^b^!rW(H{Cha7&4HWi@!Dunl;>(h+u9#L!wtNf zCrDnGe;82FPMPD{2uZ&y8H}-0&ZhCy+Y)fwDBS8ZZ z@cd{ACM3org82-6t@pWg@q%_1dJ9X3LGAaia&|8$+VGcbQE1NJF4r#(2pEamF{jZu zM^Z}KYlp;{a%na2mTc&VesF;wB*w5RVYNq~3(v>ALk#%?>56LaX|X+j0L;gq`xV9& z7qJGc3%&DFz0wyckN>oe3Hw;J8weM}L@tSU87r%km>>>|;jTtsM2x_mKRIODghVg) zrbqPG8ROGa<7?S%7%td&zZ4hDbU5=_W!R@Nxb>Pa^-rLvFUAX~s%&U90J#!qC^JZz zkHZT1P#_>*g|{NWK?@WA&wQDvS%f_r{N-oWI9XlcYiO=P2))lot6n_jjlHOajqAYR zU}2t8rGk4Xrqu%8UCvr+t|G%$IC)|O+{_hVZ?^T2Ad zgZZDPb0-*mv;67y5QR==ONbw3Aao+=shs<45n49tiWwXs%@X`0s^e+y-#D4-r%{%j zi@f1dO)1S%=X>w^IKC(kFE0->r$>KvI>r}!U+LjdC*m&`=?JE(B-U1%uuVsZyt{1T zTRs98mTC(50_%erv0Mj;p#Q3f``ney@0R;X%}af1k-InNZ!@_D!#)-g+`ugmh;y`4 zq9l_hB+hKY?1NxI!@4!0Jz?2i_WVP`Ka8-LpfLWml33t^*qOrO^IC8D`GbB=2abM_ zGsE`8c9}!GgVVTfZByXuG{K;>DlT0?Vb3+Q*dt>fafW4usf3oEop?W{MS|w|fGWT) zXB8!;OEZbu>SJ;YDR=H&JT#H}!ffaH4+ED`QQqSVRfKkufV8vjqrB2wXkVDdmeJ&P zK|1S({UL|x)Bly21^en=5)~WhWT76C`zfw3HKAuSIZp1!esUa-O#?g{cRCKJ7)vz3 zFEaZy#OyDva~QP#V*Zh>81l9IlJA^AXX8{a-!-c&PqmgxUnEUkz5o^0haLqSEsuGZ zM-zzXUqfbs-IcCbH@&3D{gY_D>H7zfqp&d=+?_>+}~FYeloPS}U$efYxB*YyWF7afJ!Qs#tf zUf9p0SC_0+NK~-b95woi~{d!nGbns|+=X`Py_la9MYwa}95wCj%t3Ay@ zKU^JC3~^63e!6$hxk?(C^f%*Ppt*YN4<}`fB;IrfgD}q*hu1i z=)m-F>Z8L8&dD^sCbXF8t05dr+Edm*4N+<#27q#=OIp6r=%KC4(>d;skl5C`dqP1R zQ5~fb*12a}jp{O@(P1*a@Ar&H1+nx5w||OG<{N1+Nc2a^0;aoClu z6dezb0F$moTtGuVLgIw~x+7Ts%!+$J<`6G77th~WwLIUGr~`XDV?!7HOkwOUif1B) zl(YFs(Q=ElQ47F#H3`$||2p1@7dV8;g-~-<6CawgM=@q{=8_>Vmagi@SH+D)&R_w; zo69Cx8!R&`3d+Ipo!GSgb&?oA5!F;ro~%n|mmI~f^E+7*|943Ba|skJ9UEmwlg$wyq5TAj|!@ML)D zLA3=O9+(kIASrfr)#~4b$8w^ekAMrZL;dug3mhHks8i=3_j01JL-C+ff6ICO+>&M$ z5Z?I5cy-ei&RyBHD_dIi?OF;#(>B!cOkZH=aeH-?hSGytyjwKKFXM_~_=&R}JCB;q zTf-7Aurk?bal6J9%CL?@*(8E*RDc1wo^`i zURR7`k486+ok3wg{q#Hgozc8u7S>}yF{`L&!>${K`Jfj`kZ15qO^Sv>MYHmWQi%7y zl}ln5yDvoT+q=U~%=of#?G{m(59Jb1P~}j0H4uCRG%xMcGuKw`W={nYNG^FDl(*8X z;Vo^jYc%nZR{JvgIcia2yFLheH_9b35vkaY9M^xdta_+4Gc2$g-pg+KA(JtHtb^Nm zY(eZZn!pDer>7+f+X08gBDJ}n#Z5uJZY3R$?jGcA}*bzW@90i^L@LKXJEaQ zQ?TI9MHionWdk++VO$nK z-%6M|a3+7V)HGV9@e^?l@leu8&fkR6w*}n&Z(je+h#eei=>3{9k2oB0-n^18TS9$5!GgWwBqK>kz z70WubaO}6&fx6+5dD`NJ;NCmC22bTq@Nrm%s7x-`J_Y&+3_h0fcU>VEb1{WdPfB?E z7j#u78|Toh+8z4qKi|NZ)Uh)5umi}7k6Fjs8Pu`of}p-hOE>U}8RT24#K|G>-a2-%~r`oocS|02w4*Fm3ph;Aj{;`!qUXlvJ4vc&hKw`# zR$b5#crZ3z@RIB)MLd*S_FZ)|l>U2vU*h#1*Hba(0k&6c1hdTc8p^ZQm~q2;`+H){ zHPWvgli~lvY2ndem)}y`n50v*m412X)tAVi_(8R9f!2#vssox2E$m2=A0j}d> zyNfE#H-}EOOtY-}CDrX9vJ&W#qIlBJ%+}F5SjJp#HcdJO;^8UeLwK$L7a2RWH1zW_ zDP91#Jc?(9TE(2_ZEzrR7%uJ9CoOu-H9i1vJ52V$LEmFqdb|1nSp6>Z}^=}3glDyKa4>_KIZSU z=5VOEpnos8R_l}1@MLBG`QYPbly;1i8ffa+gh8)&CSgVH2EezxV6A1YH1OuD$g~+pHtWH4x8&>1#foFS2BMdmt2p(bkV5fS zh&&Xn|0~j!A7m8Z4@7%}$D=tfCI<-1algtfaN&1EdoyG%_>zkQDiY$+ycG&6>|}`z z&keFt;|Qxlf#jBrS#$hIu_^Eh^-gCmv%_`X*GGPu*bB2;KP}MNMt46rY&3DFxUigA zRU0fRyx$&kahEbT1CA;pcT{*F*rXwxzE_@Feui>2jd^Zw{ea0dtM(;p!?J2YbkXzB=MrsL!g&@Hl5}r z*-IVkKW(J8F8K0x{Gj_Ofxp*YBvzT#zqOt-1W_vuG)nPCu#gRSMLj>%#jnaIDu12> zt@duM)2gp2jzwB`Cfdz*Oe?<0&;ZdIy|<&PS#*@68U2T$$&0FeZ94S!_qwFiU8lPG zDRm5xKIUU~XDGRo9b?=AL$L^TX}Yd!n8gBet<#piwXQBM1gsXlW+85EWceJ^E=50u5#bBnc2$mSBr&geEA;B z)BBePj}yuOrmgM#bk@W9a1zBr)DNWN5U)!YR-(KeMy9s*d`xRmehyAc>o0AEUAA|J ztlAW8nicj@OT!O01$BsgaIdi9&*h-F?79TTh*l$q2HWrHtm7I<@7i$u&0UjgR9+^# z%^wqi$~g}=SQ@*_2#P@h6a`8jPZW7yq^nauEt2mheK}T~6HnD#ars6aj%O06E-7W0 zBg-xbjy9`U{cl2;iZWO?uMCw6%=@*oCOa_)m!bfJdt4QH?uA@l*xa1jt<0l0uCAj* zKgf1#r6Nzh+dnLX&BDJeaJB$xiw>?wr#9?wG_ifDS{!Cp#*N<||L?e4;JB!umb)wI zvtY#vFUE=MR@O?yDPOPaEtO#J%Kn=&6QvdmHGna(Y=Ql@zpZV3jda5U^jwHkPfMM; z7)7({|FYN@u_T|b3iS!=#8`kCuPtleXQy-dVL2NW^)?LG`k?K^0_av_H%#x`uBolX zD^0MvX<2T~Pa64#XWlMYuKj{Nyo|5cqG+BeRGuO9-fx8L3S=pJo@ML>X7l#vG1o&d zy^7#%x5Ih7AckuC0X>l`L7z98W}&!E?2wJCiV_>qYuZZ|Zqs6p-qjbDEuQF?JmP=a zI;+&qRfxSB&)Z;!Nnrvu^sbvnIvs#K9e#ZrUuWwAJSZg5nJ<0+E>y?zkoT_M;jFqu zv_~!$kpxkS^>7#Stk&V)rFwXTmkoiha>uDbZgRR)6Q@HTh>rK*W2yGlx7d zn%-=s%0|98B8#OZzqH&4sN!>CWsbiA!VmDH(Q3fGKq3-QLqbZGITt3zDZiqx%$eO!(ZFj7&g+<7pDLV<3b_B zMqDC=u6L8-!&i^HYy+#Nx^_<`+SaYRoHsKAscC8|P(Zhaj^`KnUPK@UC1G5B-bZ9+ z9)M>Qz!TcWOXB76Ftiza&_fDaXsw{g`J$?ihtv5pG(z;{th7{1#)ck9iBebP*V3}? zigOFOj;AB7GUaR zd6zEFxAqu9wsSsrs&v$aF{X#YY%&rq4vkgTnKbRgB|JXIK3f@IFZ73S?W?~~ zW&Mrhn-HP2I`|T)mjVHzwPPO!l^~ePbf9O%KRk)jSbGo_n{u3o+zVKqJU!c_Uk!`y z<8uK}mgt5k1?2gmXI_#vPd`bRd4=*dX#t=BF}r&85Dw*I*-Q{u;|kc%nF+~}D7+|) zv_Nj7+&1%4ZXO*S9M$Ca8bJj_T?MJ)Nvk6#*tUnt*|+C{+O zd7OF@%COLy6_4+#R{Xei@V2MeI>;XhyJ~rRYi=Os7~1m+)t%;4)z#Ityb9hn${YQh-JeMd`!%zwM88??1V@D&a#kW{M_k3JghMp! z)p5@+F1z;{eRN#K;5ZRYA|1ec`$$(!!O2xuB)3`6Q; zi~4Oqh-CNFo|EH6_mh3egaahlU}nk){+A{vIOvQ->n6G?aOt>lD?yz84D;bZ4Fq%^ z6*m()9HEsu1ZBEpVMx5R6RcG70`C( zu+P#mY_vX$ocY~vRc*A;0rR@j2^q)_wTZoaYZO1N0db>WHA`-*nqqOJk1t9y67+c; z*jNEqHVckfEiMsgPn-USVPRU4^pdhY6B*xL)y15HOi}T#_ER?n({Yy5Pe^K2x}G~n zpxAd2=~L0qYV|5%@ZRd#Faep|W}19NCC51Xt-#6FpGkEc*t_j(+w2zlHG=_9zpcc? z;&ws5I#C{P#<9Y3S4_#)=I6b2)3F~ljd}d!j`5e}k3Ssuo12GmiJ_6df&Oj{|=fjeAj7X|~~!Wcbauj_P@ zLGI32PvV;BsW<$-tuDOnps-DTml7%zzyEIUw338Hh{Bh2L{SN?(=_ z!OM1AMHtGXn8wiZJD)l?J0iHeS-zk)k-J*`esWrsu)3h3rpYFj03yXMML+ZTgOs33 z6`k9x%BQ~S)|hN>t(Gcs;BXZMl|y?`=R&*B3~-^VwA2othgy3yN#Ndl<-ge|(-|eaa!g zY2xyuzoJF7$u~GVu#zcePTh4}P~wUd^j^7FU*?>v-)G9cPl$!ch#b4Y3N(4)-mhQ? z-;OVCZAH5@gE(UgGVBprb15xg77?UFvcnvn<>c>6AuI7~YF={N^xm~5XM0pO_gn#V zu7iNL+?eW4Q{-ZGacAGr{BSA<9Y`g~l)>rWZtV7jlJ(S(fO<>F{F)n<=m5!1Wd45> z_C{R9Hhzt;aCS({2yq^`c7kX{7u3(qGI*~MGJ$@+ebG3%#VABfPrQevB6UY)== z=_mAU|4pUI#ryGSN5^tRF*FLulpY&dOKWUdG_-$7Y7waHonUg9a*@BHJ-3S<^E3Hg z@_!Vag+r75+r?>=RHQ~JATb)GO926?Aq=T0H5lF9J(b4Mjl>=#N2d&s7Ni+nlaidY z!0+ArN8Hzaeb05y=TL-g6ApA*L(t0h2NksbPI3v`uYysmM}NsRr2&%HVg-A)L zobWRH!2mzfn7+=5MKO`np@i9?DwvkjT!ETlhz|9os5j2iYLEzLq9$~=3w}}MX zq+8xXIGbz*N}D>Qj@1Bt{m%y-fdDG1W|n?60V;BRO+l|@YKCv_6WGa2+nG)`zhCgA z?+Tsan$lpSN>2S=dg-_2x}#jH{BzXsScMlhC9JL`d=W@zY7|jnii@t52gyNC2}{2z zmJv2Nz4^V!1x%ouCM=$x0S^#noHKhr+23ia9N{`G`RQ3Jc3bBl`DXa+ z+@bbMgUsHWtR)ZqJPGh_Pz8SOMcukZdXDQGec5nFB{gB7)%7kDSC%F(?`J(-zus7q z?K}S+d1L{hvmOppZ}a?>V<|(+YuvRLmt{PEPsw9=~e`CIoBefZkR;)_30 zOxNEsR}iB@vi~FaIj+AcyHO~5Z3?+n43|OT>qG9q|2d9yc5Ei2_u8xZd(LxqTb}8&NB6YIrM7Sd%ZY1E8Q$MO>D5CVNVYSfK3Ncv zi^vt;@w>PR3KJ>hSOu2(oZ1zqw^1v_J8q%t&fndZ8S6#Q|J$pMz*Rw;~=3up|f71U^m%&9HiS& zlNYd6{Kw+8_u6x)U?5-^_FsCFBOGoR_QPIC9Dh^*1=!Yq+oA-%LwF56Upf)Sc^^)5 z{;N&#f7@(JHksQY6%eNGQ4G&R3pV+i~*9hoLMcC9Pklj)?W&evi;i_ZBY6|Wg0AN2*Mk%g%Iv3js zPVXn4c71m(G1IJSp3HSS8o+mIYiM&gJ+or=PKZt38-FztY?#>i<@o+xM{|F(vxSPi z!E=e!j;_!cOAmi5dP%qGcgZdGQ4L9Ag?4%7mG>2Z)x) zG*wke6BE(8=!~buHC<+*Jio9^Fm!u@Hu`BM5YAH^I$ zwVbx0y}MuaX#*AqMZocCF(mu7LK#w1@$B++JtN?7G6}@@w6)fMy>q?Ny@Ii7eZ+A# zk)QFAE@v~V<*q0#u}s&Iu!Sz?dsAXaWOKhHc|5%k5ev~>1db_ED~qmK(nN@@c(bq# zmFsLSi#DgwQI2q{Ikh*+i4iI@S>K+?u+VYRIr4JS@&1^rBp3s7_c9FIGIafHiVIj+ znYR#2z^K^Vq#DX_p*oA)K7V$b;5ZO%P2;4gIuQ~H&A-n{!2@eQiVF1Q>jA7dxN1$ya6 zQxlqE?i`9)S;<;H9;$cS8^L0i{vy248A@uFYJ+R}?Ql62Q$|@7qEXz`;X5fnG8aY& zLLvBG>F+bBrP<){*^5Ne5*76+^yIuDOCt(5tvMnjp#oIn}OIzgUb(W z|8p>SV;3V}%4%J#E(mz038R-&f8I-SS=V0$rytJw4{SjOYzdBqTDwIRNWh!{N+`6<|gW5ll@3Pvw*+1wgIR)+*+w_d~{b3wF0U=_h8dgE9ws0&uguV9%+D zI>5#;T(o#11`e7gd;3I8T3#x5SGY4qff}Gd6oxM#hE3K)`df)NFS26hh>4-a9qlq6 zRQ0zkZzpSq0tWX*ddwcMNLds!C|E>`j@GGZB=yh(G1lseZ!tDVSi9P*$pdG)0YjX) zPe5n5C&JoM)w26>U|~k#Z`~kB)R1)1{u6w)J=n^`LjPBhAOLDGt@QG2n>&yE&Df}Xtgt#(uGMsZimFS zKOW_(c&4>@|AR;Sj-uYsGz3v;6LT5x{K5{l0A$1eIRw&8gDcS)v0ir%4nI&KP101| zLl$9a!`c=ywqC<7o@AE|>WgQOyC)_CZT*@%1)1QTvfZN{CHHvJJC#Xa;Lt~2)m1Q_vT&QY{pUNXt+%zu8%D~ z?)r;T(B}qD_n}9P3%|&8KRfytzfyA1UR6&#gJ(~j{1iA{>$VFSwe+9H@2xluIDug z+UUO%uA#^v_(gy< zxBg0=v2Y>x_YLhmn?hbKs0Q!WqOgZfzrKHGCODk~`|T0PST~L=gFFfH4Pm?Xz?2S; zufEC^IQ!vQ>z%P-^CcFmMUt1#_eCxMo+{TVt< zL4}yK0K!G^fuovg-2iB!YbGI|Z~xK6gm@c5->TmrJ5!D{?CrI97GrPigj0VG{wmW- zCN*)A&*j^O7|;{R8S7~D4gSD>!}5D%P4+??dJU5^ zv3P%JE?D0?UKSs6V*SM5@L5hkE??qMs?hSSq*%EkHTo|4CJtDvh;v#Nwm{P*IQ7xN z7yCg=wtHLZc4<+imyG-YTM22sjP*;Hyt3<1vfR=?HY|wpzTrX_HrRAt&6Qj^?ov?h z?vuNH;%LF2Nr*bU zYEz`soW_EJ%_?gkV-CZ&Gg6+qnNAFeq9A6Du}*MVn{(%qRB^5c%eoc;m=1$$?R@F( z?VQ$K>l@>H6aF#pntO$ky%1qc%&aXajvOcGw$ie%V@`ZkR27s+lq2gR`0PDgX5FTV zOdx`}YY_j$ViCytZfZC*!5^#0>djfKZtW)dw$di$qxU!+)&+JHuSeE+w)}fwkg9x# zPs9vVV&?Q6^FIQvyEl0uxB2r8Pv2faYbEye56TLYG0whG8mC8QT&Uc z%Kne?f;P3-p$r0-dj+~vtz#xj=1ubN$>@2XU{I?=^$s9?iPngvuTqA8GU=kFm>fbU z^II2dh|)jCi+|b<-9_qROVrH3+4z-Ka9!HmW8LhmKH)2y>Zq*#r!&v=Clrd%%m=F* zpnlrAeu-w=T}mtD$O8(0Yx+4?R6>4Gob5?pv)`^$$chYkJ4Wzf$(JXdUpz<6-R2|#j9q{2c3;xM~BB3I4<{YKtU6R|VITPL&4x5YQo;5$^S#MbI)_si~Z|Q{m z+!+WKxG3h(qgq>>*_O4p&|F6**TKT1S|>HpUC|~6P$Y%UJmgI%FjdpgwTmRC66?*D zzW^wpxEokRJ&Sz;>f@)Mm$VKifU8HG_HXm$-!1o0#PG;jVGBxTXIz{!U2cbyl;&~t zyE2hndv@zDQ4iluRm}YqT(fb+1333hQa4=WIYhE$4-7?zP8IM3hk$=h|J>2RUD_k?w02*#Gowzc(oxhR48QEgj$ERvkBEoNbm;XuP-O?)0XBjO z0s)T`uK9o;;@=JM@fmyTVQWgq9mkV&kMaXvd1>#aA@_yO#r~Y}?nEPm@?|$gEYGw? zJuKGirK@@2mnY0P?f@#&4r%;VcD$P5T=s1Bg{DRPaq$9=7EG=Kf*TLJy~_0 z9~x^MRStEHRoUWgVe17mDI>wT+juREJK&r=6poj$NiwSGyf%M$En9xp7dO}s!fIBw z2`+029jA&48{3pN`47wKQ)vqKe}A)lXl!FI{KIQFx8`-%&|)A}DgEL(UqD!-uI#kq zG*T!(2;8%?Hs5&hY}VXXA1wvzgA2NJj5fNwMcmJf`hmtd_BwAJ2fn zrx9i!)wgA+dE-JNkaYHNA=US^L19@timq{2%}a$QZmm3)TYS_u*`?i9>h@WRxA7$AQML<)3bzZi9?HtY@z3X|n8 z$~O(qm(@Dpthr0{%`=PlPkdQU-!GgV{=pxO<+&^D)5~gn9rp|7*c$jZMiZCw51!=6 zcT980XH;Z<^4p!_l-kdfj2+byeL<2BRZ>L#e*XZQDrkM)^lV<3wPSu?zk~64llWbt+;fg; zkWW4vE`N~<`LT`nXk5hNLuHaY*=|noI*js6)^%~BR*tSRwZMJCSocI|KEidll8A-W z@PeGM(}N$LK;A%!p|!swEsw1Vj)&}cEFD_mo(;{nM!MDJ5;RV>Fch~ke0zj$Cekve z8KR_)fKDaP{Vbgdj)YJIDE#(zIGqW>+AWA~Yu_S1IeY%THgx>1id?*pl9he=Gsi+( zM0>y|C(r`j8DMuUec;WvPd7CIZee>#68zp{5)aSoTPQbdT6YmQmWXN&p(HRClk^LV zDn?Xd9f&n_j@-zn<1+$qhI&`AuCi?}uOsCP%ATLCpZ<)jo+)FZmeI+?{??Qcl^l34 zb}xz9>Xuw0Qy_FdZi?B6r?5~PVQ^tUzj5c)kV<481zu~IF4NlzDAAOqn| zu2S%~N_RiA7$%$}(uQ;QN$hSC2}Wg9AnuXSYX~zBa}1>`jv=j&z(y>WY%c*!CQ=0< z@`1@OM9S-q@=Euq=3~OXUQ_?0uA8WO_Nj#$-@fz$Ag{K&-^IANaHRLLqM8gMvhEzV zG6odc{Vnd=w7xw#AB5MUO7|VLfUo}y0`pD}DHT+X#zKe=iN=~`p6UCpGa=kCtQzj# ze5y!`;-!DFjdo#rJ6xr`->RP3A)fJm@6jiu1}OE$8qpv0(@Q|&>)!3$BoeC)xgCBW z4o$Fb_W=L*7t&uLzC%GEG{H%C8_z@+vsE)OqY0* zmuE3X2xC4!>VP_Un#8{+dXj%4Flw4IUXUksOE|pHf;*x4gR!ir^_Kp4F3F+Z!1s#D zI9Ig%a(!zm-fv|2+ZB>igo}lX^g|n8t_1*N0|HEeN7&nxTYst7|xUIfa*B6ccU<)BlU0hTM zH+UZz9NppJGDVEeU~LpCoGJMAOj)ZLAa5hnno;pgCVbiWq>q;e(WFJ*aUbI@>Daw}IV`|C*ZVI6YWUAtG`I_=eYq^u5QY3P9Dsm7V?IWwwr__b4B} z`<}Sfez=a~z~momg_IKJD`6yCk>fxnz6%;(+{?s~(l{A>5^WKYv>=gw_>aAHjIZoT ztq0O}8auylY|HWvl$mnrp`|EeeO!v;!0lePGj)eNT)C85bpfqUB5po*>~i@!27Ss4>5FRbaX|bwZrLoc=}L7u~>5U<{%Pi4P6L%A2X$UFA6| z7k&1ejoqQ+pzh^>eZT7QRgtfo>3!}d`WB;oAO3N?mglYK#!xdgmJbp1W4cZ#Cm zbFY`PgkAq52%@|rbr({TNzsWWj-(mejHSjX#)+|Z#UhLj6HxJw4`2T@J`5)JAj%X1 zzxWqP7KsIGxW&Fe3mK5!#7ZA9?9<55PwrNCHA}#v6Xw{16TaS!U!Nx#w*vwgM93_2 zc5SjXgK6d-*bKz~syq4G0!6aFY2rEOEi3|e#p&P#f^tOlXQ5nG3$x`Xn-_c)(@j}0 z(KGH$#_t!zNtOcXYZJD$@v#5)27W*PJX(1eZ*EX)th(%RYcvJf^Ia-q-2OAMJ-7e< zP!l)U!vxe?a?@Q}7%VjK`qz3Drz>>;jjx8UMRM0Iv2C;A=ZsYM zRP@P`)~OSjO+!;2z10@@Qn#wq!=wVCBC2Ef73uw+8m*1@ESyF%ahfqpI^U3q5+PHN zT_okEDyrosYUMNg?2i4T7f%6R?E`KZ`+;Sk6L{QFV|Djyd;utV0>e2AK1&y4worcN z!{nCq#iHt5_J-=X0J8M2&1+}y?uEOk=0=xB{cU?_#a|)zpm3ssn;cX!YUUZZmWXF4{zf;|3|Q*BO1A*A=>Ds^gY43gEH36_Cp=mTnGouwR(mj znLJw?3MB!-K?e%L5@B$Z-w-rOl}w)yVr6uRuhLZ0*vPgsrNg8Cieo!;M@55Jm^3JS z1j0SH$c|$GSO8>;=ZU$e7owH~IisdMW8#w(s5frH=ZX^^hhEQREoaQk2W2!TM>#*N zdFlCXVtCQE#XYAqCkM_V{Fy^T&x;vc6-q{@K$UMz`=Im#uY@1h(CJuOj3OO>fmSW? z;FnZ^Qf~)mKGMj|!OuCk0X+|4yd%}7;3pS#Vx7d$Bt|`^kB#i@gf()SFoc^qME}VVJz#-$$O% zL9l1pq?>}@fLcXRp2y4yc-vf1LSuc`Z9bCq{IM<#1nU|DcW2Za^_E-D&FU~z@m}-t z%D3<$uYi9V1=BvS(Sd&Y1*Y1bnUyXtvjCZmkH7!xYaIddw{`DORs))cPw2>2FV!-; z7d^3B979K!06ox{Cq1=f?9>gf)t@0<@!HY)cs^6xAX&Z7Zhh;FR{?uUI+2;KsnRv^ zLSl=2|650)2c0=4Aiy2zBk7ONScKhMZ zwHQdTx`~1G(Jgl3e}aVVs$G3R!}G@-d`-{ohpKZ<`UBjbUjzc`-Rc=H8E^t$NU^yK z2}>5eM|y8)ty$l|xVsM2(8NCUWItpf3?DOa0)h0C9i7xn-KnhAV~hYFc^}82{i$>T z*`h^bpFPC_q+UVFxDvJK&!lP|?JL@_&v}<{hT_3|RIN?w((@95eyY;j^$Snb zSjmUn3({`^-3ISFt=u-Grp{#i6SMNsN6Vn?sr;E07LnAwhP@Abnw9m=SEQM>&E?DA7wdLg2WKz3pY_2mA7?hYxav`K!LT zF8tn+?1WMjKCPti$$qNpfEUoBkT9A)P2JuqzJ2=pK5Z6>Knj1GSb3;em8l=&zbx=z z20J{_w2|z9Y1j7A#Ow2LQF6K>&sV2?7NuW48mPKfK_vN^y9t4NiTAHYf zkFZhQR|n?~C(Dtc>fXwIz-Z=77mA}2d9B}O3B^W*gQq^aY;Gv_<2;=9lmM+=t@imd z9vA;3zz)vd$6III9}4(elitK^8l;1vltz*t5~w8K7VC;pTUUuaXQ-R_nz>8=pra>c zf|@xT<~|R~7dGCRE&fvO>#FM$b3_rLW$E<>LQt$fXA> zZfoQX)4LA0%JkiMJcjP^Ub}AF{rPF~{6D!iIbIIFoR3;3>7;8jis8lV-O6I|Nohu0 z8sM}gFW2m@Yo%31kB$6Juw~(RtJi9n7pwb>6V~W^v?gb)gbaa&8XD~oYxS_)c8~cZ z1`PoK64?M<=&0uKqJ9R1h~={_PD^j1cJsf}?S7r&O_K6qT~bmD6{cU7W7lOM>tToE z%bmS{#&_cW-gJN5KTB-xD7whO{9e8h7AZ%>%!l|5_s`$*PS4_xDv})U6@xkKWi+?C zKmNQ4*+M4g{&I5{R{AO2=&aackznnbwdBe?C){8e?V4aE9G#fhJZ<`xDj$DYlxC&p z#0VlQ`4ts|GCvwn>uQ1Jn4T?2se58a>E7Gl%ZRcki<=fs#IW%Gi z{+)nEm4IQo`IZqPU+LCpF}}EMl;})gw zm9>uO0RZnwdqROkSmc=HSlx4jn2hfdH-n3L@6-f?X&O&6Qpaxw4xeYX0i8g4%ektz zx_sM?vENtRA^JM*Kkpul{+D)Lw($s5%h~wZLbsxvj@{l0X|m6?4NvMFfezk3tB!d; zF?<|ZOp`VA2LD*ojFGgQ`D(lQXV*}WxR)J2jxeU11MvgDxqM%Lk47Z@3^*|4(M3gO zDpKU&9{&bTxE;J6fRNkarNjRbFn=#+rm;5eF%xqbuB7mbU0?kq0Z%ite!Y3ARuPI< z>?8t7qZ4~px<0y=Kqt8TgIRi-CsS+D&CX;?8g=GGe$JGRxpf}^?R2}W0D5q7Nrkam zD~02#-m=@g;Ve4L35oq}UQiU2MH?8*E()H=o$Yg7-wFEO2r{4F=fNr~I{$)r7X)>D z395Z=Cv|+FCZegK=mZK*_42Bd^ZMZ)k~c5h&MS<6hKM5Q76x`1DXE!tDyPLVg^HnF~ za_ugWtgNKowV!Ymmv(HY*rrcA5BQPD(*(iuq+^PWHjZQ9vf-H*)dbu7C%a=x6 zF#fz|sCUu`w}uR{4i>SFeF`LwP$caXmwkjI-a-F2A0aKQD5#1Vn_}vH{Dw)#6M{Ca zm5!05ywfFi9V&OPSzpM-jLKjir%!8w;!1M$C-$dIQ2S?-Y%4*6{_DFjd%<}V3zKg; zpKA4Gx_H`2|G{th2ZDx^L&!m5P4N9MH5wl`n$}U)>`|&6^MXF$ozA$K&SG^Zc0Rb? z-LTtA7^Jqws@4$&fRvJ;XS?wFPKzU?nm zR{8tkVPGjB>X(6}-uOXgKuvH-rid%v8TXRtvhx!b?X`SSnj^J7*RMasc+AM#uXjt> z=^}ib26g=`1y|Kh`YcfYqNi_^p88*<}Y72@0Qn(A)+K0a9mzAN(w`2Q4%tT&@9ek3c37_DTPsf+{|HVOo!Y#dxhv zK-O)%0_3(w_7!wv%HV;WZSrEV7GEzFU}5W+4Re)tiu8xRFnw>=#`+Yay%fVT6;Nuk z#q3NvspL=v6*8=6!KW*IK>#=twkQ}}w=5f5CC4k1RyE=qF zF8UwA{8J)i93Eyd8X|!(e((NGXX|I+u<=Hv`b`&4S*5e1J;~!O`^2r0tuRowzcg?i zctlAW&#JjR%8L;sj1asxU0PyL&=vp2OzI}RNrlRN2vOcBaC8!)xvHranG8^FqiJ8lfKZmcEUmhVbzh3pEPy zrDaoZ#}aB&r1b(AtJrJpkUDFHf{PB;-?C zP}k$c@bFas5}|NW;1_+e?jpPTBhoMbXg`I>E9vso7JUofj>DdcR7=j2ca>C~**Pv^ zcdiOwHQC%GGT=2k!Asejf&wp{(Lu%Ao!kDaHU)Q>MZr7FYtTg4r&H;piPbY(l5b=0 zhWr-A5sm<`cx1*CmZN?OpM){CkH3mUes<{+G2{}$(;J;jfW#5ZNHO}tloLifUKA8K ztb{3UaFMi=MvRs~s{4^CSUeODru!5ulxt=C#})tWJ?QGQU^X2R?~h|6qwg{8Q(Y-4 zj>_lE=&d?TDKq1EbUHXAlL{_w<)F(Kgbup6ftdN5>r>LzoBLkBxk>0u`wSjj_Sqlq zzhYP5pvxPc>lLDEUUpZXoQY=ReD}P!1>@*vkkn_fDMYFm(=HK`P(Y%`i74%BWxO3P?46ZX?vfva$(H|LW2oAi>l zzZ=cIzBE^jw2T)Hzdi;qG>YQk2X8Z|bJV0`+bw!c+47ZQ7O+f0Uffx%9YcvXPnxty zM-YtQFf>Z^NPE_nT<~!$%H7KcCl$Al(yV)$U!xbn%qk7K?XP>Po6JY4S?J|mtaa$6&#dhJz)s0gmxwcExTd5X5_P>zV^mb+E zs2q6FIn9>nU#F6<(K#b|H~TA~hrm!JA7V5({zprY=jcb{@Xgaf=7zreEcD{tL0@6RM|! zjtAJ*lBX9ye4)&2oo0!~T@UhrCCnc%B`m%97&-Bn5o3w;1?ExCx`TEzU0?@SnXZ5Z zasA#TK;c4OveZ+<&jjSq%@|Z+7e6_jK_=ITw0~_|$k#HMv6V4KlD_u5v_)w3{$bNO zv{9w%C6_jjc}4JN-Yx*EvNIIy?D=%rQSgFc&VZtkI3@<@uxc#F`?qDWU9 zjdpbiIm&r=J2_Sosh}hb06QK`?(Fyd-XB-w_4YMA0_m^2DI5_IE%QGG|B8QlDZxM` zuI_S2X8K6*h#hqZc;@0<1W$-+Bk~y=-b<5tz=h)h@%=`=Vr4)3=t}Z3IhA83U0l#O0B-q& zwlBQQ&%=I2!M&A?)QT@>*Ba5J3nnubQwK$#F@NnMB8~Qd(f=VdQ!P5aeDN?L!D^x` zqF4>84Q7VGKnVk4Ef*9irm7M3P_ebU*wFq<3NuNOgu>K}*L77?bbJ0bstB zT?yZP0jTC*>Ic@vF+Y+cH;)Em6#eYDQIhiEUa9iFM-n3=k8O+JXp3VVj(+H*Aa~`R z)R&3|V&aQa?0}h^dhu+e3e1uMYC;rtDhr@yYfwrm#<}s)1adE;I)=jO;*A0|v+S#=4DByaZkZL_L)4#EH@f=WJ%L-4!8j)0 zof)0)4+~^!cijlPvdB^sC}sSMq~)J@Vp(4^x_9f6*BNv( z(C3DMc7}$BHV0Eu6QbT0n;kZIeqcM@$$>NPNlfEuZdqPXd_67E5{^eP(S>>nZzXk6 zdu5Y-L|G18_v#78il%X8V!*HNekT5oj-y9os3_^juwwLz9~pfeL&wKB+{qc^6(lps z+oslN-p}jf4hx@k6M`}}+m({t{9GQap|Z*&v9wlm1k~{?r>ZUMtQ3Q;6O2m$F$;p; zoUrY`kxm~qFtG~Oro`a~q!E$RKJ?cpH=JF{VM03OK})n*Gf{pFc=_ z{DDQ}g58B{ur+|0+F7O*i~>``4R=S$Fb`*=?n_=t3=G`;bYXQ_VrBz`MJ_#H`;Qut z7SrZnix~<2N>{M$RsC73Iq){SHi?tZ3OhCpv*)Vrqkm~&xlH`5+gkO2)iPCgKH)&b zkg}B058Y!00T8-~7N>yEspEaE+NB4zfgXl*hc|AjYpEqd)Jf)|&K)|27F;boZjM|;>ag)-bnw;WSf3;)LF%_}C1GNJw5Gn%<8 z;-c6PYuWZ;WwAYKnU(kvreJR4n7${R0gRU?I!>?d#*WEzZ}9~PL?Rk$z2F}K8{%9o0QwkYk~D|p`~{sN*1`2a5mezL zX(ros%_3CFn{15}a1JNLpQMFMCv9E>F+b#?e8!*w(3N$XWN0rBe6KDNQM6W6fiYI2 zEIyKo|NqRIT7VS_pZ;WmDvBB2WUF)l*`)!(uBjRWZ(XWm{k2DC=rk3?Gz!Hu0$=2cD6li{u(?}5 zEuIvXe{J_9XUpbl=E`PuOUwF1*lTEw0===mfSqq`-UX|msRPKp33lfwm#L>14qTIB z#GRL4U#91+m~)Wyyu-uLkV1j<&rl53K- znQdLh@%boT*e<=pZr5}|Etf5MJHxFkHaT8(1~C3fX;EFnd??U(d`*?r%sWPi;|6q6 z@F+%LTHb$*G%vsXtWSvYYX~Gy^$Wyn90A0SCaSFr@+q<8uG93xN7QZfwoYp^7Q|MB zQ5bLsdEwE6b|0Y^NR|8?P@RXPcJ{*8gNvZ|d2NH{{)o4!0m19Gzr0yDM$0>uB4Jw- zOogvpey)-RqK%E$L*gdCp$nZ#Nd>=CwT(seg%u|~IVYX^PO5i8CN+hxEf1we%UW6M zw6J~z5Cz~|XT2Ed7fmHUMB3bDLuaO%6W#Mjn7;R}SROEcVBcD%v{H9t=yGGUH+Fw! zDlsTWHmD}*#qwp~H>6LliKm;7Pul!ruPdK|q<#Ld){y`r>|=bOVtctVyVgoVVPV@Z zKzc%TpuG4mTa@}G#dxoVHtHtP*T>jQt3*f)nfHM02p(Aiv=9*UWvXE`{VKeu zJc7E7W{!qRXaRwy%D9b_mrtjCI4`M*&sYfn;X#z~-&vXqNw@y1Tw_+;1-0E|z?&4i zl6B(Ke`V0r94RW3cI)u5zh3e$RI`9o<$qXu4)x~FM+c=@B{^4u(_l0Y>^+W9cRsgR^(2Bq zhcqI0zeHF4a1@45>A!^^BOjx3sRmBei^6bpxk2q;MHeRO?Ng zQ_Uxa3P%y;hpJUyw`&E7apLn?Hy;eTwlep0{w9$&Z-b@@z$N{@v?F`s#&)yN5e$qk(VVivAB2Vr6mhsBW#T zGh%pEuUP_%S3Yf!I>TwGW+E1ujIpo?Gu`2J&Jv-M$I|$>KQSBT=EXsd?Hm|D_Td9O z&ys1vJQVW9bjIXd)-Bm`v+lZ!Bjc;(2<{ixNkBgADQ(W5*}u0dolG4MuPI<}C^=1K zFPh<35@>1|FoEPhL8#b(QB-{_9`d>}aB`=01puKyqdt2yE#HP~rj(1rN zRW;dSf3{YziSTwxhpwjq{d_&-OO2h7__M3f7)s+ znQ0(;TF*&;=UlRy^RJ_i7<(lg-lulP!|J4CJ0*NjXb3uS{@IBmVd?WPeqzu24Y~QP zQ!~=@MT~eA5v|%a(yhp^`FV&br<0(D#FT5G9+AOpz5qi(qB$WvJ&y@ zSJEI1&{i%3@TsgY!%*5xu&O z%}GoJQwDzmmbeKUN*$4%083#%y8lr!plAtQFd0l~!W*9g=s zgmylLJpCP}E&3a?GnGNfyL-c-*uv)LSjB9z?_5J_nKSs1?CS0nYFzJMc4O^Oxf|iK z?L9gyf?cL&dx21%$WLTYqccEy-RxmA3n2o{^h_hVWL3|U@jzO71ZXn`$yNj?zN8XT z2xj&0^s_^d#^f=#>v0rNXnrJ87uE(H@bRj6X}u+n^MQ^OI)8n!#(l|F3Fi2&ah+!Fg=m@% z&TZYf&crJ9-M%`s>?Szw<6he*udqO0Rf|KmDb9tGe=>Dl^91UNo9#dGUe_5sC-?jn zD6IHn9^aZx*g=jGPJoBudtpo!vwDFoRx(ucT9H|Ekt@ztfZXI=*TV?G8CDoEMmP@b z2(antNw9Vrtb6(l)^Wdi80!s+r6#^0%&ByrczEPoNkB3@G2(mwqqxf~e(- zD^2zdoXnTE5=MZN3m*mi$<=&L1kY`^Dx8{W{ZZ2|7J_wq0<2LgsA-}WnH19w=HZE2 zN zgTJhUg(#7YhNuFWQe?4Vrk}Z1kuOcW1IU#_YJ}dED4Sg~k$zGteu0dT@By7y*XK%g> zbNjp2CmqroP{7N7^v-&L4;);ESJy2JqTcyJ|0+MN>J(HY-fj0?K~^&T)X!h&_8$MI z8b;ME9L}eyfB&Dre_Uh=3K$$a?0qbu!kL&I)bh7Pa2!L-6k4ZP-{UhHd?^Nyr}ZW3 zfmwqRtxPQ^=3&lACjmVgJZ`}b;kmGo52K^BLUS&Qt(t~pI6&j|#;A`D<4~sNGPrx@4@;`HU(GSK> zrG|M)?F>utxWPe7EQWh(d=QEP0OC7weFYO1_{sT(>I0jUYPs8o7)j@H=YP>J4bJ8? z3RJJyC4C%KkLFa$sPco%1D2pA$<%FsM^(y@ZIcfK!rO{E-i2+rf)!AMARSkUviKoz z&D+m4rr`B(^~vcX5y4Kasp)RPr}3trsiwqVZa#L{R0s7f0m-$&M?3FKi%XlI6w z1{M`Je8$OQv&8{CG`7lb5-n6N*k8o)!jJnKvj#2f^Ei{eba^^5y1KL8%fv@hh{uu@ znOjk2sg~opVoVDPa+Xd~(vuAA>;#P~F1xw`&3>c{4DT!;job*EbulteU{-@LQP1>B zg1tBC(Zdhgm#f%O8v-XjFG;=*s&PWKrsU2g7VI19pSZe2gs|a!wD3j0rMHi2I<*ts z5`>Smv{-|OnjgzCX6JUCF}ScA_5Y>_WTslcnA9~+R8QGlLrp7})zIz?HW>37b^l$? zEg4mKBqR>zbs|W4|2~d?pquD`vByf1DL9egaMw zev8_57*EeM?CB|yZ>ZHa&OY|=3h=UzYl;Y4Kk7FoNN4}IsJ4>)Do~1O|B`Hg%2dXx z`Vyw^>1W-&JUX%38#k~#7QfE|vwolTaDBLCIBVXbT>F5*5~}V7Fm;N`ClVH|sO!>5 zYqyn|fh;e<#cTJUXE*c6xxa20ee0R4Z|Ku3$0vA`K9jMdm=m&o@_!YbdpuMBAIHbq zTsCxZ+1w%__sunTQMwpn<&sO&Smc`P+;UejBzGdd3(0LRx#Tu{TZBxcVL}Z{ZY`Hm z`u@)E-}A@WIiJTlXXm`%&-e2c`Ag5O@Rk^m4w66cOW@U6-J1B)BpDQY%`qnRdk;*^ zgBPHH3-i6wmok(>qxr*F=RbHA@pQJ{`=YofN*8FG0F<>x3Cep~xH<0#OEBYYH!?*F zA)3%e-xSCzY6_^ElM)BYHmUn)eA9kiQZ8*}ms)HIlna>^7W?(~+>2v8j{J4yeM^#bZ zsl)I+5ncaO@Wr*mfu@*v6Qa2A+q@K*w53&0LcXe!7a)v3)x%>=2YS37SNa$dzl#U? zabb<^mMG3T%Hh52N1NR)$6t1xfq|lq-xmdF$T^&>Nt+npO~=(% ziAwN?4V~!E_oFJ1#kXPu%3Ly;(c%~0U<5u$!3h4cLwtfGsAN44$c?!&CIGDXwy zSRuj<(_js< z5b=Wo<=37;F$d+ajt>@BunI}6^O`HPlxlH9KH@*=?PAT7GeyCn zQn`Dc`z-fm3yV0gnUP#hwH2l;*T1y*2GO8nd+w=GYpj%!9r4A^alYGh&xkKNlHu!P zONraikMR*g&1?trrXe_CBB#Enp~tC9oHVN$fg6D`ivfrLBhqVq3jp)Gi(Z*`UR49! zH7@20&m|5a6mbhTMooY(Q>@p_2fA(Z2TEla7n?0TSm5%zDy1RSJKwQ8lqbC`l$QNDAvJKXct@{`u zSzC~Ei=X;vC>BEsPJ6wTU7_kOSAFS;yR@aPG+7pJ8mz^r?anS6-{Wcuu_ajASF&37 zJY5EdB})tQC`d}|EpgS}Wxly2b&44~)SSB`0F=5e5GZYKYp&fnBNpmck0#is6)8KA|$`5p5&o++yP z6btXaRg6-v=NYOJbzR+*5X-rh&_ti<;!uCw`lVe@uD;Lql2x4_4j5xNW1H4b4b($Ku!O{CGpJl!MWLv%7r$#`4Pyva|- zb35uLxZvlj?4B=8D_FzcV1G=cmGLQe`l&^|h6U9{@}##L2K}e; z?|+~R2a!K(ax_I^Q>{YYlr*%7E9WetQ}R+X4)Wh*vaE6+K0gqUQrI&H-O=lx5PV8s zAFO&QF)WuUuE8Ykti~8b^{pFetNHI5-euFf8+dotRjL})q|+vl-lZqVwx7F~C!@G_ zrpin$-v3fUde{A3`VYhd{@gvj)C2h|MgDLD9j-zjk&n`{39KFdB@iU{zSh`r@^OLf zrInFqO_$&PFcjAbWQUJb*M?f&&>^1XEHybld2W}lFV$ZMyJpeuK2>n5?2BT8eSbcj z$0moP$F1u0#avoWxlYqpl2lT$1n;c)XTF=i_!4?YJW^?@-qdV^n)X!AO$bK5KxzuN z?eJRDuAKM@cX~)l#3BvM>mY{k3UYN8-u)-@7_rKK8);Q33Ji@5eSO0YW79aHcfYhY zzq)yaPa*W{3rzkKp8$t(+bpSzqKrusF-@Wrmy>&7QL=KllTJ;4#00#}}3Dt&A+ z*^=EHM0o=g-&>u(&!%dJ0g*ZOVMCihX=Bd+L#jSltXvwC|XYGbRp zkWKv1iOVx%wQy7TTCJjd_(h`#VcOS~wSmm==7>9A`$E#~u9xYli#Mz*yLJs-qwsWb z(bxtTWSh=}ui4kxagN=^sD!!%1e?^V`35 zC$T~Oo_WxHuCjGenSpJAfiu+^Vcre|j-aZA<*Q@!0<>SpUI}l5aE|3wupy(A#hYxU z*?q2rm+4K3Dg*`$B&rp9JNXP*jw@hb56qy!7UE;gfpNZ<{)329m zl2R`J^Jr@O-CuQo`Jkv{rRCKbnND{moYsiO7=17E&oArJiFZ=$B|5r?>e?Vh6LoV0 z&37x#y0kg%;G@yvUvV;?-xy=7^lRT284dyu7Rp_m#X40KmA+F8^r6Xl zA*W_NZkki-8l=72bIiYuN9858x}YpV(ef-Hg4x#twVX24a?yJd-|t~NoF5ZU!zS7AC zD0a5dx?x-UIwhh0nMI~ppx4bmd%{i5e-jK7AHxwmoSe#mejBcww|zBUEh8M~-#QJ0 zEKYMxIvHnlHiq!7%CvBK;YLT+2-GHAg*8utOVt2Ris zC{ST3-a;i_H$a@i@6Bb2E=q|mYC$H1cyRUp)A9-K<^<3BCvxCLBBkdXksr?G`jdZE zh958Nz}*S?iJ}YU)v}Z-PU##ZYX>L^RZ1@Kmb#yty7Q-0{a*k@ZTF5OXs*VZ|Nee- zP3In=Ho7v|n%nd(019w4->wEYu6)hGT1%xmyZm3W=7l!9>L}xy>u%WP}Q62_&O8u6%R-s7`=Kz@z{&S!elbt&l0MD3v`=wdo<@Ci2v+n<=F#aF<|y88s|)X|5F;H)h=YJ zo2>r!tIzz;lU5d;e&OEitHdbZ9IxSL+N~N%wYKJM8Upe=Y61qmLcZyhk0bAT4d1y+ zS8jbyT-41g{rMf^x<@BnbK$@I3(yx8>Z;VhR*IBcJ)gTo4q!Z!b zpSHzMukya1{%ejBJ? z*@TQ-d}$;-GSMp-Yc250=$(6kd+FKW?gDWRzoCxyy*Ea!O#d>Q7)LP&eZOoFNs3h_XW?` zS#tqTe>EVH<5n?ru^0R@?O&tYEkn(r$6_JcYIMw=2+W$BdYf`qv{($K>TW*w)V8Ebh9j0gtF=4XHNjbbPT#;9L{te8UQcHBx%_Y4Z zw9nrOQG(d2m)Vf?{nXwBFxEa7e*ds{)`8reC3U5xU9dtWslCJa&8ZJBFG2Au=>Q|6>dUO3D(rK|eJ?~PP2`KoU`7@E#O|~B3NN%c>2CWGp)(EHIliKV zLqB2vmb;cHjUfM4nPAq(gm8)=Fm*NjJDw(5Kbm3Y+JgEb__E?vax0{Ke=7y5E7z2hmcLCMz)zInuLRKQQW{esA6gz zwQd@^E-(}CeQ<;X+2PwkucYlF%=V8|p+qrfk;;^`GShNwgWqdS{#(^w7{rEuS5;5j zTPJi)lO&gS&W4@dRbcJoeSLd;+((jS`^QHXqVMjC3`#|kr3x=_21Po@1PvQyoiGxf zXXJ%}8EZ`<6|Wg8ybg6jRMj7vm+}{4XtwZ)9qNn1Kw-2s6;@8tMAZRn%jFg>N*>Q&rwZVy3nmV#6VR_{Ox=%=A3Tgn*m|JTV+x0XIeK0kEQMJp6E(Rgxdcy?PkE{~=3 zVL28IwzT=S4+OKcX$l{j^Eh79RG?_ag$PfbZv9;sI!OCGqe1!fq_|jO@yiD~bGPgI zv8neq?*s$NoZ2LdiOng;=VG(094|(nt*$Oe>Rl*-GecL;mNNX*!$1uWdW9 z$NWT6C^(-BB#8u7bTs3A!4*aKr5R11Lz;C4Wn%Img)h31E2I3aoAe==82zAh9U!vc zhU!^j{jq987P_H6n#_B5BBR3C&oZBTMC!K|R5LrjeIFN;?Eavh11>D+IPuS%0%@7h zb-?FgU+Eej>d7A7R6884yh5S@hPCeQCZN)YC4`Qc^1mxWlQk<$7kggJLQU zhdP5bkJk)Uaed&ua8;(KPRvXT?7R5!{_jM#-K4uN4;ya;vcQ8wK%TfLrwf5Wi0}d7 zfi6&gEo8Po$9v#G?74X-p(*GI#a+D+^VT11uW^L}Yx4erEVkd|Tsq6AG@&y0Z|bi? zIfBGzhYgpNKC_t7AZrvVVtNDH^+?Hsqs9`|2x9*+O6pR@!rCV4CdLv_Wd9Oh-ma+R zIjA!weWN1~S^l61A;hFIkH9_+5OD4*WO)YyUfmpwIs#fMxwI@1i$*W4O$3N9j$jn_%s9L-46f|R8C z(~nn#j{z!D#s5I6A3FqOBE+e9m;!Vx_MbFOEfx(0=@1>AsT-x*s>%>4S^!pzf?9I$ zAZRQP<*FE$NvaXed4x3r{lWG~vUKo&)b0W?#As1@Cs@bQ%Z`iRpnRQ<)9#jCdD-<@ zY{$ULMm^+NrgdyYy~Z&hFr;41*@d_*@BDgXd|^Lm_jhfk_>T)lJa@6%`lA36%Khd! zhGs>>G!}~(Sg4X5E(J1O8ZdxVV{lLem7#)+qX}=oR(AxFU!9!dyGqn#jrv+zvB56l zP*SI{X-b&eM66NSf1r`ux!rBLPo9WB4xMa$*HBWn9gJE1et3MGugoCYJ`2A=unLzF zxU^f$fA=qOslxruq}v^@tfE+8#K5E`gYSAGwZ!ju^TXszoGp*sM!IYT<0CPe%an`P z+t-9lz(jMBxV8rOZi+bbTDuT)Y1VI1t>KhY4r@EE|u1VEw72x;-_K{l7>k% zr|Z7Vv-_fF;la1q!*L9(h=%>VNzRA7fKD$IZ8Z$$m-DvA$f4}XOTt&ROjvICSS59rZS)rWa z^+N1mn5F-jG6Cen=#(qjWbuaoKtN;V)X+q9d1^)=8_^4~`F;SWJeN1#^i;iZNkwc? z-gHWZpz1~{gJV_8wU5x!`+IUGpSsvg4Axin3SF;VNGfr(*~)phx|DBl_Q&L#sSIa@ zTKdMv$pxO%wOpIi-nCk8gT&!sm7_Xvay^TwX+dOt|4kOThs3NG5lSAV;uAd;$G zK~DXapurX%^&QrIeTByGv6`3YGPzuRx&1(*OJ>gJ{A7RQ<|*9f7hry;@&Gma&)w3ZD>>Z~ z_)5d?xiBD`d+MpGUSCC3FGTJ77Q~pm_aRj$i=cG<1DURiAzR7W` zg1#@Xw6Bt{WAV-0zY=k?so`UJ<~^=JeU#6Ix8-_k$-N+tiAJI9fU%+W&J3BJWJ;Uj zBWb;`gv3#>4~YU+#2vl9rcm`B*?o|%ey*U<`}0Sq+miWzSHl}rKTol?f31}M@$8O* zTq>o%^-*X)tJ|ArZ=uxvY^dgjhyCD=?rm#?=S`c_R2!f{h#JAXXuuP^gD+LRnIIC+5Va$X5zwSTY0R`49!e@LGD@TPqP!PH5UK%-`Z%cW zOi2rZ#?TyYsH0g0ZIomT5^-0uGukAEuox^drCSTEzNMfgKz4#R6C|kWooLbkSe~Fe z^LzyML8AB-unwpq<9^l$XNp#!hv-;-yc~EZN68eV_7>_{d3nyUF zwF0Y*Yulp+;_p`4&2(v^;Ct}WBwu0ABeN~g{&<*^TCndR3yO1*2tg`CXC6c6pxbAl zut+Wv9(7_@r;&2xHeD4G;zu({Goo=k_t2>%@7FzfnPe%IkUYfeF!TV+W#y}yO~d5X zYu!(#SwEg)5u6s*$m1>LRvMn|z>PnlP#PHh6c>W<`AP!tAsSpo zF&a+7gH-`_esvnKa~0_3b$2)}7YnQq!JVvli6+iHfAYF|fn$%6@yFcg<95^c$0py# z5Ybr?>!X{oOy{U+rt9R5w+cm#Q#50~ug7c>@dEtAd#ON%EkbpK?{YXU4R1?SuF%rCGct$9%?VHLA^DN!Q~G^a5TOP#skHD zCaLJOK+)vffbTg7r1hBgch{&{;_avP)s9JsZG$>|S88X;Wr}(n9`XHN07F+KU=*k2 zG(-a!RQEmKK}!^!^fXE7I*X?J+D$+9-8|1*bmpc|K)^+ZCrR^ZEr{LKY8kyp3V1}Q z(ksr9Uucr}$#OVew@3rG-h;vGCVmPQoi`@oLGJJ(65gi`O(IOXMHj`gXi7^JYRS4)TE`O>z3CF7|q)J1jEIe-}5>OiCH|ouUw*|>v zjh!Uop;gO6X#@%{ZS_JZBw|rHt^(M(zQYNpBh_6uJ4w(9Ah58@6+zWjA?}MMA&To) zPgQpjP~zYwjEB;a3r`LL>ibL?os5{4W6{usj>9CSG`cG7C|$YV2^}xnMDnoYku3UM zNJC@r{HWeVVB26hf?5?n7784fUXB~^!9=j1 zoq(*H#zTsXfm^qzUVMUt^Y0uAgrbXp3nMY*Ct(v!G6+}#7AeI*hl59!1aMcn6w>_p ziA=sl8j7D_iHBm9CQlK L4~l}C{x|bKRFD`n literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/AddonWindow/dialogheader.png b/resources/pyxbmct/textures/default/AddonWindow/dialogheader.png new file mode 100644 index 0000000000000000000000000000000000000000..af7ba85beb3d021cc93127f2f5281bde2586aeb4 GIT binary patch literal 4875 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 literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/Button/KeyboardKey.png b/resources/pyxbmct/textures/default/Button/KeyboardKey.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8b2bf94f3e3c5c4218892d3a6f39760b315105 GIT binary patch literal 5929 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 LNkvXXu0mjfjr&mz literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/Button/KeyboardKeyNF.png b/resources/pyxbmct/textures/default/Button/KeyboardKeyNF.png new file mode 100644 index 0000000000000000000000000000000000000000..077777fdb13b58368e7ab3a54a19405857e04f04 GIT binary patch literal 2968 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 literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/Edit/black-back2.png b/resources/pyxbmct/textures/default/Edit/black-back2.png new file mode 100644 index 0000000000000000000000000000000000000000..399e2d04c51e8131890c010d6b59eea293b4b88a GIT binary patch literal 23797 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 literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/Edit/button-focus.png b/resources/pyxbmct/textures/default/Edit/button-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..831dd453811ace00242123419945ad44605b9184 GIT binary patch literal 5605 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 literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/List/MenuItemFO.png b/resources/pyxbmct/textures/default/List/MenuItemFO.png new file mode 100644 index 0000000000000000000000000000000000000000..14230c064646e262334327b46ff7e98c50d61a96 GIT binary patch literal 24951 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 Qd#3@Iu1|%15j}MUjP6A literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/RadioButton/MenuItemFO.png b/resources/pyxbmct/textures/default/RadioButton/MenuItemFO.png new file mode 100644 index 0000000000000000000000000000000000000000..14230c064646e262334327b46ff7e98c50d61a96 GIT binary patch literal 24951 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 Qd#3@Iu1|%15j}MUjP6A literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/RadioButton/radiobutton-focus.png b/resources/pyxbmct/textures/default/RadioButton/radiobutton-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb4cb5ababa656449673975b816e821298b3180 GIT binary patch literal 5190 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 AT>t<8 literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/RadioButton/radiobutton-nofocus.png b/resources/pyxbmct/textures/default/RadioButton/radiobutton-nofocus.png new file mode 100644 index 0000000000000000000000000000000000000000..282396db622014b9382cd3e3012d2217346ad207 GIT binary patch literal 4442 zcmV-g5vA^lP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000JsNkl=1R)Cr5d>Y>T^DgBF4_u8>7tvqo7PJ0V1r3Ys@Arq8a0}j`Fve?u3R3m8Iwsw z>V?aDkGYfi{qH^Z+;h%LCP@-`nwyiSygd`}q#Nh@2Rb@B1b_g@_)gN1Yy;3jG9h_S zRVVFURJEq6LQ>A2J^SPY7(4+q0q7yQ8o+XrEhH-d%Bor>SteN`Ii{+ks(Ov&9aXK0 z$eg@LX0~1^o6V|oE)QTmfE6SKKti%YvTD%27ge=HvZSg-RV|X7GBKm7TI%obPZmT# z9LE6A>6}{+;6(tEg7@9eddc96s`^lX7ZgQNQB`lN>bR;_j~zQUe*)q-ZUOMRb8bTb zo`x@zELxxPCS>px4tQr|C;n z6<&fcF8cPQjM}3=R(ufAy%poqC@3hj#DYy~u>uyqhJN z@s42U&Yj7u1;lZz05$?xmx8|q;EUnm;jz?LAR;Ovc@gPMefF1#+z^q9h}6Ol_U+pT zK4_Vs!<;~I+qP}9JBb0Tng;%#k&%(lQt%Lwr6RIUL|&N&UPNS>h`c5uZ-_{TeMdw@ z4jed8HCVAj5Z2pB>a12Eo6WWX_yj;4z)y~hjC`7!fOZjCHOq78l88)r^E!O^Fi5r< zyl+*KH@9rrQmcCfve|3~z^f_v8p-ccv%Yo?@FF5>L}Z13*t2I()qum+MzZzPsZ;fv z5P)U?Z+drW@S{URLxo`2auI26Ks>hCx`>GE*s){M%!ni->s?5gJ2L=QS|BC> zYUbz91jAZHB-g;8a%C8ok(@GcwQD=cmgxdNH_hw|fVBa9mE_pKz`*Tb*eYp!%ln(H zTepteK8Q$003wokl9_r0D9Pmke3|4A!H}i~nNGTOg`UYy5@Y5?!esI49oY7L^w zvZ`JQKGu285RsZp3E(4=&(*U6YT#vy*)ON;f5Gx}lJ|l=pa7a@OeskwKG`rK_nuh7 zPEOhED*y$68CO76r-DqXsH*Xk5&)pv!<%K)>M@~7%Z^HxyM_nW#QL;!qlFbbenkATE#HAPh|Mp0CXq9`<@s%2M= zZbPXJyx7A7Z~z7YB=riouBxRdiu`7-Zr{GWH5fM9VED3#-1QHILg7Q73>bVBz;8W0 zJu?e9efqSh>U}e#ux=BsLPbP|8z^AVZ{9+o&`Pq$>^@`B@kIdl>rQBF6>bIsDkN*Y zy}eDTz0imaeJN%8A6c!{!`A@(q4c@1EuCK2zJPpT0_wLKxF@U#H@Kpfc{1<#(mAU=<_lr3MHF#&P4R&87dDoW}eGdu(64p{v*LMM| z0nn0y7XV*6=Z15++}vxU2M-?fBASDu6N4ZtVfp?+BtVM zm&?@}{(j*2@#8+>X}5P^A$XL^o}wU<3?oWSHe?Jhm{{DVP zvIW30Tam|tw>{+HuNe4fKA*2F*gLY5Cr^s)h1g0SO93njpd-IR9^P+$0QUe~25`|i zcO5`EpU*GsOFrMuoH-+A3Lx15AZO;)X3qlPKFRw4CII{a;0A!2bFS9i-94w@&pi8I giDv@-=K}s60REWjhyVZp07*qoM6N<$g3v`j*8l(j literal 0 HcmV?d00001 diff --git a/resources/pyxbmct/textures/default/Slider/osd_slider_bg.png b/resources/pyxbmct/textures/default/Slider/osd_slider_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5160b0e8cac68ecd4b466b2386ed1d407875f6 GIT binary patch literal 3012 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/__init__.pyo b/resources/scrapers/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..6e889d59afdaaaac42e696e96e0150b991f323ac GIT binary patch literal 183 zcmZ9GF$)4Q423H?h~WRY>1GiT58VWZ6SqJumv9vB+LE+_|5|W#F$Yct-WT$Q_cDL4 zSDVkP?aXgxx(_N@DA1T|H940`Vg4X@^^RM(39&$fqYu!ebaL528=am#oFjU0h%pGH wq4Yk~504b<9GNL(VqlV3xFZ4S*rh4US|5D2wocEy)RNs8u?)1IUJ;e~0v6*j6951J literal 0 HcmV?d00001 diff --git a/resources/scrapers/cache.py b/resources/scrapers/cache.py new file mode 100644 index 0000000..260781d --- /dev/null +++ b/resources/scrapers/cache.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- + +import os +import time +import pickle +import threading +import zipfile + +import xbmc +import xbmcvfs +import xbmcgui +import Localization +from net import HTTP + + +try: + from sqlite3 import dbapi2 as sqlite +except: + from pysqlite2 import dbapi2 as sqlite + +rtrCache_lock = threading.RLock() + + +class Cache: + def __init__(self, name, version, expire=0, size=0, step=100): + self.name = name + self.version = version + self._connect() + if expire: + self.expire(expire) + if size: + self.size(size, step) + + def get(self, token, callback, *param): + cur = self.db.cursor() + cur.execute('select expire,data from cache where id=? limit 1', (token, )) + row = cur.fetchone() + cur.close() + + if row: + if row[0] and row[0] < int(time.time()): + pass + else: + try: + obj = pickle.loads(row[1]) + except: + pass + else: + return obj + + response = callback(*param) + + if response[0]: + obj = sqlite.Binary(pickle.dumps(response[1])) + curtime = int(time.time()) + cur = self.db.cursor() + if isinstance(response[0], bool): + cur.execute('replace into cache(id,addtime,expire,data) values(?,?,?,?)', (token, curtime, None, obj)) + else: + cur.execute('replace into cache(id,addtime,expire,data) values(?,?,?,?)', + (token, curtime, curtime + response[0], obj)) + self.db.commit() + cur.close() + + return response[1] + + def expire(self, expire): + # with rtrCache_lock: + cur = self.db.cursor() + cur.execute('delete from cache where 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 Twq08At9d|$#amuSE_;6hwJ0dx literal 0 HcmV?d00001 diff --git a/resources/scrapers/fuzzywuzzy/StringMatcher.pyo b/resources/scrapers/fuzzywuzzy/StringMatcher.pyo new file mode 100644 index 0000000000000000000000000000000000000000..980a4b71cf41126c867ec190dd132f07c1e1d3b1 GIT binary patch literal 4423 zcmd5J1c@I7BW=LDmr1VL62cC=vfP3z)y-5Kfp^Dhf+}xQR&(1mbW9~G5U+Vn!>o5DUs6Gw)|A?CX zf`k&{fTR@46R8yY&>AB3#Hb+-8bYe3P`8Ad6EB3g6ynDN>bJyRcODC1$<&*7NgDCpU%D%0DX1$j{H+&}3`h>8CogL#LCh^V86|+&XhKThNP56acnF_* z4Z!i&5HASvoFKq>)T%Ha5cn34%!3F#Y6~^bN=K+RD+@w(SXmTmft4kp7FnV7msq(i zg1zo-Y-XFpj=!f*$2yC3Mci7NoM=BzBWwM`agsXUWWF0}-pteiR zeoTUZH7|q+rGO+rRliXVH+h)g5m(G#uiK(uxh9F8$+SZ+EFzZ}*M_PR>mu5pgQY{0 z$3|&ecC<=pSJo}#$q0rg2M7;S6Q9`HHdd!cU78_S*qpT8hy5p37q-8nMoHG+$@6a_ z7xe=ZQFqXPY*f;Zlrov^=jnKmWb028rOmoCMWHjNi+-W485gm(eH#~1jdycfwx?y%5PJ6CW3Q$a#PquOVE}Um2=|f{9s?->;wpe~XMq8D8=1wv zMf<6ojnKn8CXLbGqXD2N%#8e)Ty5e?C1y-7F|!YFcM5lgkZ!(HBW?e8q_tsdq%&sI zt@o}Wg_+P0z--eeq#!Gh;d`u59{E%_N*y#NU9f;Xm- z8LW=8S!S@>BF>h7WsuLW(g)X2Fu{X3okE$q*u?w(-o=o&9g^xxr+e@wn46~I*>SZM z+812yrTufl|g3Tujwkey8OpLMVnN;sXL&;di)7#KiA@KJ4BxmhLE>i)j zGSp~X*tTTLYd7z-+D-n>x98if_8hfluiPw`Dj(2vj>9Y0S0)V?ce?UfzV`6SvjCB| Twq08At9d|$#amuSE_;6hwJ0dx literal 0 HcmV?d00001 diff --git a/resources/scrapers/fuzzywuzzy/__init__.py b/resources/scrapers/fuzzywuzzy/__init__.py new file mode 100644 index 0000000..0301595 --- /dev/null +++ b/resources/scrapers/fuzzywuzzy/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +__version__ = '0.4.0' diff --git a/resources/scrapers/fuzzywuzzy/__init__.pyc b/resources/scrapers/fuzzywuzzy/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..726a6df1bd0d704da7946bb2952d1e8c18d53aad GIT binary patch literal 226 zcmYL@O$x#=5QS4k5XF0R6}oUGA{N~VF8tZZKnP7N!8Qp=T4`6F#XER1FW^K32j&~z z@R)hS_iXZdK28PsRf2Pk?I#F9$OV~@V>*bt5h9~=n(fo*3sVGRt#n=)%~*<({NZmX zHw!p>G(awDr6IR=%L9jl;V4Vk8KHm+VYCNZHKo$DRYDpXjB`>4>A*>E8dpdUzHr>e fTi2%VyL$vMrnCx-QQL(v{#({YG?iR^^Ts?Muh%^S literal 0 HcmV?d00001 diff --git a/resources/scrapers/fuzzywuzzy/__init__.pyo b/resources/scrapers/fuzzywuzzy/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..726a6df1bd0d704da7946bb2952d1e8c18d53aad GIT binary patch literal 226 zcmYL@O$x#=5QS4k5XF0R6}oUGA{N~VF8tZZKnP7N!8Qp=T4`6F#XER1FW^K32j&~z z@R)hS_iXZdK28PsRf2Pk?I#F9$OV~@V>*bt5h9~=n(fo*3sVGRt#n=)%~*<({NZmX zHw!p>G(awDr6IR=%L9jl;V4Vk8KHm+VYCNZHKo$DRYDpXjB`>4>A*>E8dpdUzHr>e fTi2%VyL$vMrnCx-QQL(v{#({YG?iR^^Ts?Muh%^S literal 0 HcmV?d00001 diff --git a/resources/scrapers/fuzzywuzzy/fuzz.py b/resources/scrapers/fuzzywuzzy/fuzz.py new file mode 100644 index 0000000..48470dc --- /dev/null +++ b/resources/scrapers/fuzzywuzzy/fuzz.py @@ -0,0 +1,270 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +fuzz.py + +Copyright (c) 2011 Adam Cohen + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" +from __future__ import unicode_literals +import warnings + +try: + from .StringMatcher import StringMatcher as SequenceMatcher +except ImportError: + #warnings.warn('Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning') + from difflib import SequenceMatcher + +from . import utils + + +########################### +# Basic Scoring Functions # +########################### + + +def ratio(s1, s2): + + if s1 is None: + raise TypeError("s1 is None") + if s2 is None: + raise TypeError("s2 is None") + s1, s2 = utils.make_type_consistent(s1, s2) + if len(s1) == 0 or len(s2) == 0: + return 0 + + m = SequenceMatcher(None, s1, s2) + return utils.intr(100 * m.ratio()) + + +# todo: skip duplicate indexes for a little more speed +def partial_ratio(s1, s2): + + if s1 is None: + raise TypeError("s1 is None") + if s2 is None: + raise TypeError("s2 is None") + s1, s2 = utils.make_type_consistent(s1, s2) + if len(s1) == 0 or len(s2) == 0: + return 0 + + if len(s1) <= len(s2): + shorter = s1 + longer = s2 + else: + shorter = s2 + longer = s1 + + m = SequenceMatcher(None, shorter, longer) + blocks = m.get_matching_blocks() + + # each block represents a sequence of matching characters in a string + # of the form (idx_1, idx_2, len) + # the best partial match will block align with at least one of those blocks + # e.g. shorter = "abcd", longer = XXXbcdeEEE + # block = (1,3,3) + # best score === ratio("abcd", "Xbcd") + scores = [] + for block in blocks: + long_start = block[1] - block[0] if (block[1] - block[0]) > 0 else 0 + long_end = long_start + len(shorter) + long_substr = longer[long_start:long_end] + + m2 = SequenceMatcher(None, shorter, long_substr) + r = m2.ratio() + if r > .995: + return 100 + else: + scores.append(r) + + return int(100 * max(scores)) + + +############################## +# Advanced Scoring Functions # +############################## + +# Sorted Token +# find all alphanumeric tokens in the string +# sort those tokens and take ratio of resulting joined strings +# controls for unordered string elements +def _token_sort(s1, s2, partial=True, force_ascii=True): + + if s1 is None: + raise TypeError("s1 is None") + if s2 is None: + raise TypeError("s2 is None") + + # pull tokens + tokens1 = utils.full_process(s1, force_ascii=force_ascii).split() + tokens2 = utils.full_process(s2, force_ascii=force_ascii).split() + + # sort tokens and join + sorted1 = " ".join(sorted(tokens1)) + sorted2 = " ".join(sorted(tokens2)) + + sorted1 = sorted1.strip() + sorted2 = sorted2.strip() + + if partial: + return partial_ratio(sorted1, sorted2) + else: + return ratio(sorted1, sorted2) + + +def token_sort_ratio(s1, s2, force_ascii=True): + return _token_sort(s1, s2, partial=False, force_ascii=force_ascii) + + +def partial_token_sort_ratio(s1, s2, force_ascii=True): + return _token_sort(s1, s2, partial=True, force_ascii=force_ascii) + + +# Token Set +# find all alphanumeric tokens in each string...treat them as a set +# construct two strings of the form +# +# take ratios of those two strings +# controls for unordered partial matches +def _token_set(s1, s2, partial=True, force_ascii=True): + + if s1 is None: + raise TypeError("s1 is None") + if s2 is None: + raise TypeError("s2 is None") + + p1 = utils.full_process(s1, force_ascii=force_ascii) + p2 = utils.full_process(s2, force_ascii=force_ascii) + + if not utils.validate_string(p1): + return 0 + if not utils.validate_string(p2): + return 0 + + # pull tokens + tokens1 = set(utils.full_process(p1).split()) + tokens2 = set(utils.full_process(p2).split()) + + intersection = tokens1.intersection(tokens2) + diff1to2 = tokens1.difference(tokens2) + diff2to1 = tokens2.difference(tokens1) + + sorted_sect = " ".join(sorted(intersection)) + sorted_1to2 = " ".join(sorted(diff1to2)) + sorted_2to1 = " ".join(sorted(diff2to1)) + + combined_1to2 = sorted_sect + " " + sorted_1to2 + combined_2to1 = sorted_sect + " " + sorted_2to1 + + # strip + sorted_sect = sorted_sect.strip() + combined_1to2 = combined_1to2.strip() + combined_2to1 = combined_2to1.strip() + + if partial: + ratio_func = partial_ratio + else: + ratio_func = ratio + + pairwise = [ + ratio_func(sorted_sect, combined_1to2), + ratio_func(sorted_sect, combined_2to1), + ratio_func(combined_1to2, combined_2to1) + ] + return max(pairwise) + + +def token_set_ratio(s1, s2, force_ascii=True): + return _token_set(s1, s2, partial=False, force_ascii=force_ascii) + + +def partial_token_set_ratio(s1, s2, force_ascii=True): + return _token_set(s1, s2, partial=True, force_ascii=force_ascii) + + +# TODO: numerics + +################### +# Combination API # +################### + +# q is for quick +def QRatio(s1, s2, force_ascii=True): + + p1 = utils.full_process(s1, force_ascii=force_ascii) + p2 = utils.full_process(s2, force_ascii=force_ascii) + + if not utils.validate_string(p1): + return 0 + if not utils.validate_string(p2): + return 0 + + return ratio(p1, p2) + + +def UQRatio(s1, s2): + return QRatio(s1, s2, force_ascii=False) + + +# w is for weighted +def WRatio(s1, s2, force_ascii=True): + + p1 = utils.full_process(s1, force_ascii=force_ascii) + p2 = utils.full_process(s2, force_ascii=force_ascii) + + if not utils.validate_string(p1): + return 0 + if not utils.validate_string(p2): + return 0 + + # should we look at partials? + try_partial = True + unbase_scale = .95 + partial_scale = .90 + + base = ratio(p1, p2) + len_ratio = float(max(len(p1), len(p2))) / min(len(p1), len(p2)) + + # if strings are similar length, don't use partials + if len_ratio < 1.5: + try_partial = False + + # if one string is much much shorter than the other + if len_ratio > 8: + partial_scale = .6 + + if try_partial: + partial = partial_ratio(p1, p2) * partial_scale + ptsor = partial_token_sort_ratio(p1, p2, force_ascii=force_ascii) \ + * unbase_scale * partial_scale + ptser = partial_token_set_ratio(p1, p2, force_ascii=force_ascii) \ + * unbase_scale * partial_scale + + return int(max(base, partial, ptsor, ptser)) + else: + tsor = token_sort_ratio(p1, p2, force_ascii=force_ascii) * unbase_scale + tser = token_set_ratio(p1, p2, force_ascii=force_ascii) * unbase_scale + + return int(max(base, tsor, tser)) + + +def UWRatio(s1, s2): + return WRatio(s1, s2, force_ascii=False) diff --git a/resources/scrapers/fuzzywuzzy/fuzz.pyc b/resources/scrapers/fuzzywuzzy/fuzz.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aaae9cb37cda583d76095117b01fde9bcf048636 GIT binary patch literal 7514 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/fuzzywuzzy/fuzz.pyo b/resources/scrapers/fuzzywuzzy/fuzz.pyo new file mode 100644 index 0000000000000000000000000000000000000000..aaae9cb37cda583d76095117b01fde9bcf048636 GIT binary patch literal 7514 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/fuzzywuzzy/process.py b/resources/scrapers/fuzzywuzzy/process.py new file mode 100644 index 0000000..d5ba7ac --- /dev/null +++ b/resources/scrapers/fuzzywuzzy/process.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# encoding: utf-8 +""" +process.py + +Copyright (c) 2011 Adam Cohen + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +""" +import itertools + +from . import fuzz +from . import utils + + +def extract(query, choices, processor=None, scorer=None, limit=5): + """Find best matches in a list or dictionary of choices, return a + list of tuples containing the match and it's score. If a dictionery + is used, also returns the key for each match. + + Arguments: + query -- an object representing the thing we want to find + choices -- a list or dictionary of objects we are attempting + to extract values from. The dictionary should + consist of {key: str} pairs. + scorer -- f(OBJ, QUERY) --> INT. We will return the objects + with the highest score by default, we use + score.WRatio() and both OBJ and QUERY should be + strings + processor -- f(OBJ_A) --> OBJ_B, where the output is an input + to scorer for example, "processor = lambda x: + x[0]" would return the first element in a + collection x (of, say, strings) this would then + be used in the scoring collection by default, we + use utils.full_process() + + """ + if choices is None: + return [] + + try: + if len(choices) == 0: + return [] + except TypeError: + pass + + # default, turn whatever the choice is into a workable string + if processor is None: + processor = lambda x: utils.full_process(x) + + # default: wratio + if scorer is None: + scorer = fuzz.WRatio + + sl = list() + + if isinstance(choices, dict): + for key, choice in choices.items(): + processed = processor(choice) + score = scorer(query, processed) + tuple = (choice, score, key) + sl.append(tuple) + + else: + for choice in choices: + processed = processor(choice) + score = scorer(query, processed) + tuple = (choice, score) + sl.append(tuple) + + sl.sort(key=lambda i: i[1], reverse=True) + return sl[:limit] + + +def extractBests(query, choices, processor=None, scorer=None, score_cutoff=0, limit=5): + """Find best matches above a score in a list of choices, return a + list of tuples containing the match and it's score. + + Convenience method which returns the choices with best scores, see + extract() for full arguments list + + Optional parameter: score_cutoff. + If the choice has a score of less than or equal to score_cutoff + it will not be included on result list + + """ + + best_list = extract(query, choices, processor, scorer, limit) + if len(best_list) > 0: + return list(itertools.takewhile(lambda x: x[1] >= score_cutoff, best_list)) + else: + return [] + + +def extractOne(query, choices, processor=None, scorer=None, score_cutoff=0): + """Find the best match above a score in a list of choices, return a + tuple containing the match and it's score if it's above the treshold + or None. + + Convenience method which returns the single best choice, see + extract() for full arguments list + + Optional parameter: score_cutoff. + If the best choice has a score of less than or equal to + score_cutoff we will return none (intuition: not a good enough + match) + + """ + + best_list = extract(query, choices, processor, scorer, limit=1) + if len(best_list) > 0: + best = best_list[0] + if best[1] >= score_cutoff: + return best + else: + return None + else: + return None diff --git a/resources/scrapers/fuzzywuzzy/string_processing.py b/resources/scrapers/fuzzywuzzy/string_processing.py new file mode 100644 index 0000000..7c706d9 --- /dev/null +++ b/resources/scrapers/fuzzywuzzy/string_processing.py @@ -0,0 +1,41 @@ +from __future__ import unicode_literals +import re + + +class StringProcessor(object): + """ + This class defines method to process strings in the most + efficient way. Ideally all the methods below use unicode strings + for both input and output. + """ + + @classmethod + def replace_non_letters_non_numbers_with_whitespace(cls, a_string): + """ + This function replaces any sequence of non letters and non + numbers with a single white space. + """ + regex = re.compile(r"(?ui)\W") + return regex.sub(" ", a_string) + + @classmethod + def strip(cls, a_string): + """ + This function strips leading and trailing white space. + """ + + return a_string.strip() + + @classmethod + def to_lower_case(cls, a_string): + """ + This function returns the lower-cased version of the string given. + """ + return a_string.lower() + + @classmethod + def to_upper_case(cls, a_string): + """ + This function returns the upper-cased version of the string given. + """ + return a_string.upper() diff --git a/resources/scrapers/fuzzywuzzy/string_processing.pyc b/resources/scrapers/fuzzywuzzy/string_processing.pyc new file mode 100644 index 0000000000000000000000000000000000000000..976c18bc218f485ef7f8148a6b8339286173e77b GIT binary patch literal 2249 zcmd5-&5j&35O(+M&Tf`OlMBZPA99!+7;YR80zz^KAR*Md2(fC(^0eJEUiH{b+uq4U zM2ZAY!htv7$#?+rRrT!bB}fP%v8@?*m4B+f`l`x3`SZcqAHTi1XvF@R;QfUtMf@0o z!LJaV5Sv0=7NQ`%6kRDUOJOF$PDEP>b0mHh;uj%)ygZ`i^Z7B3y1($u3rOi9hU{Gv zj8&aWcFM^U6 z8+FR+hz*-hL^T4-zr*I4#B;HBQ8t~9Q5xGiZ=>AUv<^n5Ao~%Nj0`bK=Ve-3xd}1x zVcWK@an>if)w_lK%2?fXJBeZ3$A+R@+AeHmj#lm&xG~5^+AzpvNNZT{bCTK{8FGTS z;N^yRpoGx>8S(J}ge1fj_$Y{j*QNNm6j#Uw1k4cov^j4vu#H2YZT3xa!OOw+od)4> zx0BKSl&x>946XE7>}*1UXw8s*FyZrNN%LC=v|2`_t+R5wMmlBeVQxfB-tq~2&p*%Z zN&Q2n0+0+TQ80r|wAzGC@8F7{#=IQYNol&6PVv@iQt z08~FU8|Uk%eg9l1T~|RvUDe+N<7#b8@UiZ@ymEeV?TihJ6ovswvqL@D81euf>evjr zCtGcP^=h}Jp&s34>n9d5$C(%Hx za6Zo|6 z0H@VG;CLVZNYKRepHXyyt$#xiDl88^aucHU?C@cuqc!px38v~tol_r=`IReoZT)TO z-qOWK?;c(00U}R9F+4?)J;KDu-SL0QUGC8m|BgF8dUv^Fc+B17TkhtkL@W(TdA+ep zCF)J3Ho@eMRJym6GNFO|9%TM-jNglj&T%DIv{F%$ZhMQR|LxMM=&s=lfZ~}RPs`c8 x+3DiW)J|^$?ab0mHh;uj%)ygZ`i^Z7B3y1($u3rOi9hU{Gv zj8&aWcFM^U6 z8+FR+hz*-hL^T4-zr*I4#B;HBQ8t~9Q5xGiZ=>AUv<^n5Ao~%Nj0`bK=Ve-3xd}1x zVcWK@an>if)w_lK%2?fXJBeZ3$A+R@+AeHmj#lm&xG~5^+AzpvNNZT{bCTK{8FGTS z;N^yRpoGx>8S(J}ge1fj_$Y{j*QNNm6j#Uw1k4cov^j4vu#H2YZT3xa!OOw+od)4> zx0BKSl&x>946XE7>}*1UXw8s*FyZrNN%LC=v|2`_t+R5wMmlBeVQxfB-tq~2&p*%Z zN&Q2n0+0+TQ80r|wAzGC@8F7{#=IQYNol&6PVv@iQt z08~FU8|Uk%eg9l1T~|RvUDe+N<7#b8@UiZ@ymEeV?TihJ6ovswvqL@D81euf>evjr zCtGcP^=h}Jp&s34>n9d5$C(%Hx za6Zo|6 z0H@VG;CLVZNYKRepHXyyt$#xiDl88^aucHU?C@cuqc!px38v~tol_r=`IReoZT)TO z-qOWK?;c(00U}R9F+4?)J;KDu-SL0QUGC8m|BgF8dUv^Fc+B17TkhtkL@W(TdA+ep zCF)J3Ho@eMRJym6GNFO|9%TM-jNglj&T%DIv{F%$ZhMQR|LxMM=&s=lfZ~}RPs`c8 x+3DiW)J|^$?a 0: + return True + else: + return False + except: + return False + +bad_chars = str('') # ascii dammit! +for i in range(128, 256): + bad_chars += chr(i) +if PY3: + translation_table = dict((ord(c), None) for c in bad_chars) + + +def asciionly(s): + if PY3: + return s.translate(translation_table) + else: + return s.translate(None, bad_chars) + + +def asciidammit(s): + if type(s) is str: + return asciionly(s) + elif type(s) is unicode: + return asciionly(s.encode('ascii', 'ignore')) + else: + return asciidammit(unicode(s)) + + +def make_type_consistent(s1, s2): + if isinstance(s1, str) and isinstance(s2, str): + return s1, s2 + + elif isinstance(s1, unicode) and isinstance(s2, unicode): + return s1, s2 + + else: + return unicode(s1), unicode(s2) + + +def full_process(s, force_ascii=False): + """Process string by + -- removing all but letters and numbers + -- trim whitespace + -- force to lower case + if force_ascii == True, force convert to ascii""" + + if s is None: + return "" + + if force_ascii: + s = asciidammit(s) + # Keep only Letters and Numbres (see Unicode docs). + string_out = StringProcessor.replace_non_letters_non_numbers_with_whitespace(s) + # Force into lowercase. + string_out = StringProcessor.to_lower_case(string_out) + # Remove leading and trailing whitespaces. + string_out = StringProcessor.strip(string_out) + return string_out + + +def intr(n): + '''Returns a correctly rounded integer''' + return int(round(n)) diff --git a/resources/scrapers/fuzzywuzzy/utils.pyc b/resources/scrapers/fuzzywuzzy/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e05ddb527b9a7ef9719f9aeba7740d70ffd4b85 GIT binary patch literal 3057 zcmc&$+iu%N5FJvoY{_!$-0LDR*cL^EqH%913KU7uAVwcrz%ZyZNeu-A&0WcBQ>3!H zw4)#f0wllDmwrNlen`KiAJCo|%9bAbT+8NiW_LN9IeTV?jlb7AfBydVNk+3@6Zan| zB=;8th5vwZqH#d`0R^mwl!vq*%36c+292Av-=si?bhJdONtk@{sjdhcq}D{ZO8Oe9EA$>auajDr$s6o>zqf&?%s=?`0!W_KsxVopbdnpd zZJN8?dTAX?eQ!-M+OuV*ohz-u6qyEwjGyLwQwhxm1_hk;~phmanBKlsII z>jsb1*c5|DlgUo%(?MLOP)CEGOJxSBQf1)=le`+4V*A7>U2gl*TD(fzfz__8EaDru z%%&5zHLPC0o}ThBsJzMD_GIcAjgvGtD)l;X0!s%|u8V84dzu}0^Svb1eVe&fn~QWbUn*9x4#6oc*iAS z;@Wum{gE#8tBHMh8;WDETK_?gyO;+v>~#+P2yur@k$$ZpU<8L$=r4rMXD^}e{rZjP z7kQf&E(iMl>Vjs372 zweTW?nwXIcdJf?teQ>hJD`f95RCPl2=W7jF+nKE$H96Uk-GGo$Mcx3p`XSZ@Rp#Gr z#bAg-6+2=^MQL@9MPZkpPPAYSe#cCBzl>p49z1W;1y>5c3Q^3cbUZfx(t(a|z#&d7 z$2mzz#tyDqVa9ws&pyHU2op7q02p}L-Yf?%RN(d|;AEWP%~Zv{z4LwN>cYPB6XK(i zZ04sIxGdF;Ju}V}&ZkADVoAgGgJ5!hD zD(3sr9jZTIf7Xbiy8cE7(@r$|-MbfAJuXjB^rJM-ql3yvx%MdVE=mg(71j6v^5TBf z@Nsl{h^FTzX{HyKh9w$8`okyt z6YkPJDeT>ZEQgjP!wRwKB#ALq_d_>z{tlG+N6Pl>Y-hM41!{sZ;2@*p9%+hU8FSf= zxs2D<=L)16i?kSNfx$@m&kn8h17$KFGv%Zi)YSceRdzbw;^AWqbLd3+f4|FC;K2QH msj6H*3!H zw4)#f0wllDmwrNlen`KiAJCo|%9bAbT+8NiW_LN9IeTV?jlb7AfBydVNk+3@6Zan| zB=;8th5vwZqH#d`0R^mwl!vq*%36c+292Av-=si?bhJdONtk@{sjdhcq}D{ZO8Oe9EA$>auajDr$s6o>zqf&?%s=?`0!W_KsxVopbdnpd zZJN8?dTAX?eQ!-M+OuV*ohz-u6qyEwjGyLwQwhxm1_hk;~phmanBKlsII z>jsb1*c5|DlgUo%(?MLOP)CEGOJxSBQf1)=le`+4V*A7>U2gl*TD(fzfz__8EaDru z%%&5zHLPC0o}ThBsJzMD_GIcAjgvGtD)l;X0!s%|u8V84dzu}0^Svb1eVe&fn~QWbUn*9x4#6oc*iAS z;@Wum{gE#8tBHMh8;WDETK_?gyO;+v>~#+P2yur@k$$ZpU<8L$=r4rMXD^}e{rZjP z7kQf&E(iMl>Vjs372 zweTW?nwXIcdJf?teQ>hJD`f95RCPl2=W7jF+nKE$H96Uk-GGo$Mcx3p`XSZ@Rp#Gr z#bAg-6+2=^MQL@9MPZkpPPAYSe#cCBzl>p49z1W;1y>5c3Q^3cbUZfx(t(a|z#&d7 z$2mzz#tyDqVa9ws&pyHU2op7q02p}L-Yf?%RN(d|;AEWP%~Zv{z4LwN>cYPB6XK(i zZ04sIxGdF;Ju}V}&ZkADVoAgGgJ5!hD zD(3sr9jZTIf7Xbiy8cE7(@r$|-MbfAJuXjB^rJM-ql3yvx%MdVE=mg(71j6v^5TBf z@Nsl{h^FTzX{HyKh9w$8`okyt z6YkPJDeT>ZEQgjP!wRwKB#ALq_d_>z{tlG+N6Pl>Y-hM41!{sZ;2@*p9%+hU8FSf= zxs2D<=L)16i?kSNfx$@m&kn8h17$KFGv%Zi)YSceRdzbw;^AWqbLd3+f4|FC;K2QH msj6H*', re.U | re.S), + 'inner': re.compile('<[^>]*>[^<]+<\s*/[^>]*>', re.U | re.S), + 'html': re.compile('<[^>]*>', re.U | re.S), + 'entity': re.compile('&#?\w+;', re.U) +} + +UNSUPPORT = { + '—': '-' +} + + +class Clear: + def text(self, text, inner=False): + text = self._unsupport(text).replace(u'\r', u'\n') + text = RE['br'].sub(u'\n', text) + if inner: + text = RE['inner'].sub(u'', text) + text = RE['html'].sub(u'', text) + text = self.char(text) + text = RE['space'].sub(u' ', text) + return RE['cl'].sub(u'\n', text).strip() + + def string(self, text, space=u''): + return self.text(text).replace(u'\n', space).strip() + + def char(self, text): + return RE['entity'].sub(self._unescape, self._unsupport(text)) + + def _unsupport(self, text): + for tag, value in UNSUPPORT.iteritems(): + text = text.replace(tag, value) + return text + + def _unescape(self, m): + text = m.group(0) + if text[:2] == u"&#": + try: + if text[:3] == u"&#x": + return unichr(int(text[3:-1], 16)) + else: + return unichr(int(text[2:-1])) + except ValueError: + pass + else: + try: + text = unichr(htmlentitydefs.name2codepoint[text[1:-1]]) + except KeyError: + pass + return text diff --git a/resources/scrapers/html.pyo b/resources/scrapers/html.pyo new file mode 100644 index 0000000000000000000000000000000000000000..7115b88b08d547c934ec660dcd227b87bce3c03a GIT binary patch literal 2699 zcmcgtT~pgu5Z!CZHaK>Gv`vR(N@^OY73De=zjiXyU=}!4B zJ4Q(oYT0oxE4Q)YH1EY?TweOleR*p=ufZ55d6f5ah2fWm4a-Y+zqz|E+ib<5r-#Jx z*$*IQ9SQ`1rVue8dJD=dMhUWbY%@iGkI)3R3=o#84C>@`+I)&{LH#FNyz8$}ufaLA zqDw_**iW`Zpx-D0bnH5RhJz|HL#(eWq<6(VhezUGba<+u&UtCKNKBDssm^oG1RZ8E z_!nxO?VNWp#jz0PpL)8?kX%Pun_XfzVf;)6d3ce_xox;elyNcI`qteu$N=|#(2ElH zewID-a?f>A53eWgqcn(IF9_1axLI7BM9J!T6olz&o@$MR2(_z2lNK6j=^9^q8SlmE zvzqmt865Bt#LPmGx~Z8M4 zmR#YqaIWx5hKmFVjgO!^Q#^wwJ44(PgzPkN^5>9u!Sa2FV86o4#cjq5tRV5>(E_^8no(&lTC|Vi?zFiecFKHaz^6f`G2Ihz9l?4eJ&4x5Z?` zR29>Ygbs`rz!T9vYxG%A=b&MEXXJqs9@yBt|Kbm_5sv2#(l1FVh4&}P8ub@sFPqS= zc)KZCG+$n1Kbga#nk@RA7bS|GU{LaSHxA1FCG$; zyO;2AqSGRi0x6QnKh;7~l;qOxerA%kwMM^V7P*U*-<%+PX2g_uy>QJ>gD^{Z5eNBE z*q0@vqL(jJPfCB1jL+dRD-d%7iqPU_l?Ay`xv5&JUa`~yp0;Z9rRC<`F2m_|%U0j* zr9lz%E2qZ~UTng$dvO${zNE$-K4t_VM$y5mUix`r7J?>A`>67!8R%A1_0<~meUH9^fM!~c29QVsiG%W^a6 literal 0 HcmV?d00001 diff --git a/resources/scrapers/kinopoisk.pyo b/resources/scrapers/kinopoisk.pyo new file mode 100644 index 0000000000000000000000000000000000000000..d6b9135fc180cc90d3b3b55e041967f3fd0d150d GIT binary patch literal 26820 zcmeHvd32oBmFKG`S(^=b17ow5Wdky{B->yXBMZE+1u#z8U}9uMS+68LyHq9B;w7nTn5bkEE`eLCm#nVe+KOuCcq&ZLvh{C@X- z_0=a?GLX)A&deEG^)2___uhT?-gn>n-Kw9R*D$#88ymVz@b5>s--=)U!fIn2{$eI= z%%<=;W;VsjaBDVMdA259W%{bkrfL&onkti?Wcq5%rW$>(HtAZ^S7$cW>H8#;t~Y)4 zW>dY1`74a8F|O8J@9K=J$F0G*$+%51?mXPiH|_%5rW!X5x9P^sz-^{+7vgr2akFr{ z*tpra%`xs0+%7flGTbgV?h4%E#?8g8(YSfI%{T5!+^#b2YTTNPTY%dʼk#Wtq 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 Qb;tkzU;poxKz;T90=FKu2><{9 literal 0 HcmV?d00001 diff --git a/resources/scrapers/kinopoisk/HTTP.py b/resources/scrapers/kinopoisk/HTTP.py new file mode 100644 index 0000000..495321d --- /dev/null +++ b/resources/scrapers/kinopoisk/HTTP.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- +# +# Russian metadata plugin for Plex, which uses http://www.kinopoisk.ru/ to get the tag data. +# Плагин для обновления информации о фильмах использующий КиноПоиск (http://www.kinopoisk.ru/). +# Copyright (C) 2012 Yevgeny Nyden +# +# This program 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 2 +# of the License, or (at your option) any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# @author zhenya (Yevgeny Nyden) +# @revision 148 + +import urllib +import urllib2 +import base64 +import time + +import LOGGER as Log + + +class HTTP: + def __init__(self): + pass + + + def fetch(self, request, **kwargs): + self.con, self.fd, self.progress, self.cookies, self.request = None, None, None, None, request + + if not isinstance(self.request, HTTPRequest): + self.request = HTTPRequest(url=self.request, **kwargs) + + self.response = HTTPResponse(self.request) + + Log.Debug('XBMCup: HTTP: request: ' + str(self.request)) + try: + self._opener() + self._fetch() + except Exception, e: + Log.Debug('XBMCup: HTTP: ' + str(e)) + if isinstance(e, urllib2.HTTPError): + self.response.code = e.code + self.response.error = e + else: + self.response.code = 200 + + if self.fd: + self.fd.close() + self.fd = None + + if self.con: + self.con.close() + self.con = None + + if self.progress: + self.progress.close() + self.progress = None + + self.response.time = time.time() - self.response.time + + return self.response + + + def _opener(self): + + build = [urllib2.HTTPHandler()] + + if self.request.redirect: + build.append(urllib2.HTTPRedirectHandler()) + + if self.request.proxy_host and self.request.proxy_port: + build.append(urllib2.ProxyHandler( + {self.request.proxy_protocol: self.request.proxy_host + ':' + str(self.request.proxy_port)})) + + if self.request.proxy_username: + proxy_auth_handler = urllib2.ProxyBasicAuthHandler() + proxy_auth_handler.add_password('realm', 'uri', self.request.proxy_username, + self.request.proxy_password) + build.append(proxy_auth_handler) + + urllib2.install_opener(urllib2.build_opener(*build)) + + + def _fetch(self): + params = {} if self.request.params is None else self.request.params + + if self.request.method == 'POST': + if isinstance(params, dict) or isinstance(params, list): + params = urllib.urlencode(params) + req = urllib2.Request(self.request.url, params) + else: + req = urllib2.Request(self.request.url) + + for key, value in self.request.headers.iteritems(): + req.add_header(key, value) + + if self.request.auth_username and self.request.auth_password: + req.add_header('Authorization', 'Basic %s' % base64.encodestring( + ':'.join([self.request.auth_username, self.request.auth_password])).strip()) + + # self.con = urllib2.urlopen(req, timeout=self.request.timeout) + self.con = urllib2.urlopen(req) + self.response.headers = self._headers(self.con.info()) + + self.response.body = self.con.read() + + if self.request.cookies: + self.cookies.save(self.request.cookies) + + + def _headers(self, raw): + headers = {} + for line in raw.headers: + pair = line.split(':', 1) + if len(pair) == 2: + tag = pair[0].lower().strip() + value = pair[1].strip() + if tag and value: + headers[tag] = value + return headers + + + def _progress(self, read, size, name): + res = [] + if size < 0: + res.append(1) + else: + res.append(int(float(read) / (float(size) / 100.0))) + if name: + res.append(u'File: ' + name) + if size != -1: + res.append(u'Size: ' + self._human(size)) + res.append(u'Load: ' + self._human(read)) + return res + + def _human(self, size): + human = None + for h, f in (('KB', 1024), ('MB', 1024 * 1024), ('GB', 1024 * 1024 * 1024), ('TB', 1024 * 1024 * 1024 * 1024)): + if size / f > 0: + human = h + factor = f + else: + break + if human is None: + return (u'%10.1f %s' % (size, u'byte')).replace(u'.0', u'') + else: + return u'%10.2f %s' % (float(size) / float(factor), human) + + +class HTTPRequest: + def __init__(self, url, method='GET', headers=None, cookies=None, params=None, upload=None, download=None, + progress=False, auth_username=None, auth_password=None, proxy_protocol='http', proxy_host=None, + proxy_port=None, proxy_username=None, proxy_password='', timeout=20.0, redirect=True, gzip=False): + if headers is None: + headers = {} + + self.url = url + self.method = method + self.headers = headers + + self.cookies = cookies + + self.params = params + + self.upload = upload + self.download = download + self.progress = progress + + self.auth_username = auth_username + self.auth_password = auth_password + + self.proxy_protocol = proxy_protocol + self.proxy_host = proxy_host + self.proxy_port = proxy_port + self.proxy_username = proxy_username + self.proxy_password = proxy_password + + self.timeout = timeout + + self.redirect = redirect + + self.gzip = gzip + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, ','.join('%s=%r' % i for i in self.__dict__.iteritems())) + + +class HTTPResponse: + def __init__(self, request): + self.request = request + self.code = None + self.headers = {} + self.error = None + self.body = None + self.filename = None + self.time = time.time() + + def __repr__(self): + args = ','.join('%s=%r' % i for i in self.__dict__.iteritems() if i[0] != 'body') + if self.body: + args += ',body=' + else: + args += ',body=None' + return '%s(%s)' % (self.__class__.__name__, args) diff --git a/resources/scrapers/kinopoisk/HTTP.pyo b/resources/scrapers/kinopoisk/HTTP.pyo new file mode 100644 index 0000000000000000000000000000000000000000..5362f1e98e36debee8f2cb5d73b348406857778c GIT binary patch literal 7697 zcmc&(U2ojR6&;c**(Kk6(4!HBrq(brX#YNry}X>X?ZR4M}*!F-y%OSUvdeBzp48HXH3OwSldW9iQwSP&9UjPGZ>EIVHk4ErJ|6M}>XXTQRj_ z!fcM2%s9?d&p0IyPdq$>hsA)Bfi`J6$0%9$FLpaq;#xPs6a@l>tkFGgdgJDED8B65 zd3fwCE$*7m39XO)!HmGw(|FV|+0Qh?d0~cA&G1Z?YX(+-j)$i$nKqqia<=ONKUGRF zU6PiXBhb%c;QxW zPOY?8&<5I(Or)Qs>#(OB%7byI>1G0k#7o}TV|ZDf^ztI?wc>(K$HjfSG_+Us^FB;A z7E>^^9g6-@x?b=_ZpCYZb%~G{nU)CBe%y;Q=nEU$j*HetQ3rbaQ7i5j3FM?4c=K+u zc10sx_;!}1nO>=tMzJ`@B5{pYH-!i^?;_cXn?!uNrBA+EXY*m0t>*=a@xeGI<#$tl;7`JgH?dk8HNTlb3+OgxE~-9lo}r z!xxvN+(jvJURIFBVRx%^mZW(M`{AG9rc@UDLD-ABab`_{(J_moB#T>x>>}*L7Ng=g z=+?aLSox5=0Iu?AC)h~yVo$dZW0VuzKforZG#; zE`)i~x-lp=sx|3aNCZJY%=3q77VUZZIg)&{+pWBbkF5=oZd4MQ9tiRRZIgzIDbTEJ zAyy1F?A{!RL-#aj@d+9|B?X_wuIea-de7@qe>QSrm+svm5dpW!%blFov~^y z*er%zT6Ayv#UU6j=#MT{lN&U7nE$Q&=gcae@yt`K4a+~O3{)c{XZw%lv+_kIOmbIlAnm$D9HA!pbGq5J?e?lCP` z&!?%BdCI2~D4%S^VT6iF^Al84Xj{1)n!aX7CAS=7=%#!VQHHL^wb#Nte)k>uzg-xq z4Mm&;?4(Ig9!FZg%4JM>K6l9$Xq7a4qomhPeXgU&5zZnZYiYFObKBI*!w0eI0-M*E zJ{0qiuJyYa?`Y8nVRvva3C?G13DELc0OP!h-1ahZ*;#kmeZ@He&z^GL@<2nsVe3&U ziaQ{`{t5`Zn11w-z6J-sb-zpBVHpQk#~0=dZ$d&tT7eUR;>ov>Bv8%Q%xSng3>Ya7 z@F_}JP+d@MANApg$)1=eNPL2D4^XadKQY^r{C);PS$)Yykpm$Ut0o8rlcoOr9|KtZ z_Pa@;&4=}g(oG*C(cIuv*&rXcS_&W9=d1;zBqP!flT5=!xbFXyPoY_`k0%D7yZ;z1 zrvi;L>P)HznZa+vIpMS@D&L$Ur)pR7MpsE?g-4NYqr8qAC#$ zLu=F1n8uk6AuFA(;(PNqd^y4pS$LtBT!w=0Hbi@e@=|- zcVA4{e#SklZhnBKLp0v1R-db%sGqGj>f=5S4=qmMhhi_F8Dpy+ylb<7Ubs{|p44 z1f!?dOe<^ZZUMf-S`QFT1_Th{5C|YbD-b|?!2_sZ8UQMA27tP)2>?||2Y@Pn13(?w z0zj3DEEvbd5D+yjI0LFG4FHjjK><7_1W>mtxPpPq)rA>fN%fv;H2-aOnOjx!_*a10 zGOv$FYws+g^kI)3U&-|<=e|d9f#6kwIRYAz{|11(ju!&ypzx__?eO~Jq_0?E-H-12 zeT(~4fWJZTe=g@E2pFy7BN6Vg?EN%q8p-d_Y@YENaMrqmKUaSit7t=di-igs!;nnu z5)fo|s1dKiK#cQSx#f zN3mQXweI3 z`5Az?ircW@z5fir{XTWrBBa^Wz{cnC8!%!V?{ZU5eY z<99i{1#lpn{(Q9g2gE3&O-?I+llKGfU5)TRq-*)ukih%?Jt5fEnb$Gwrv!{XvNIp& zCZia&YhOx_ye2=8*Yz1t{*I=%G0u5d*tk39*aO%a#cdH#=bF1KrLg^U2P)uiX!<80 zO2_&OvZyll-=(BHXZhC%=*%iDlteV6Sfbqws5~jN#*Ih PhsB@U@Q(lD_-p?K9in4I literal 0 HcmV?d00001 diff --git a/resources/scrapers/kinopoisk/LOGGER.py b/resources/scrapers/kinopoisk/LOGGER.py new file mode 100644 index 0000000..94ac243 --- /dev/null +++ b/resources/scrapers/kinopoisk/LOGGER.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# +try: + import xbmcaddon + + __settings__ = xbmcaddon.Addon("plugin.video.torrenter") + debug = __settings__.getSetting("debug") +except: + debug = 'true' + + +def Log(msg, force=False): + try: + print "[torrenter log] " + msg + except UnicodeEncodeError: + print "[torrenter log] " + msg.encode("utf-8", "ignore") + + +def Debug(msg, force=False): + if debug == 'true' or force: + try: + print "[torrenter] " + msg + except UnicodeEncodeError: + print "[torrenter] " + msg.encode("utf-8", "ignore") + + +def Info(msg, force=False): + if debug == 'true' or force: + try: + print "[torrenter] " + msg + except UnicodeEncodeError: + print "[torrenter] " + msg.encode("utf-8", "ignore") + + +def Warn(msg, force=False): + if debug == 'true' or force: + try: + print "[torrenter] " + msg + except UnicodeEncodeError: + print "[torrenter] " + msg.encode("utf-8", "ignore") \ No newline at end of file diff --git a/resources/scrapers/kinopoisk/LOGGER.pyo b/resources/scrapers/kinopoisk/LOGGER.pyo new file mode 100644 index 0000000000000000000000000000000000000000..ca1b8bfd8486fbbef5a20a80f72249b1cbde7151 GIT binary patch literal 1774 zcmeH{-)j>=5XWcl@~a_1NufUYQV`@`%!>$8L=62AB_)N8B_*DO>+R;e{MbEr_lkkO z>Hp#%=pUdn8*7F3L0|NxckJBvZid;}&+Sh5t=)Wj@%3#AKd%s!R@Vepk z7R@t?ws6|~J6=P(gR)qbS+2SlxsbZ+v@udSXZtzdPNYBjM$PoYJBqh7yuYD1PKMymrb#^RXb$UaWMoOz zok^I&6ZtRwAART_>JMmlSH_qo;V~8Xw0F0++Wo%Uz03YxF8y%yN2?3tr-<*L@u&a7 z#>0OL0)X~JwxDgDk7uBrIhV80o?$ryK@Ns_Xy?IF1!&KL0vHs*%YvGLK?!=eW`^ZC zmUAr6vz%wS%yJpL0(Y-*7wzEk>m;9{*+uY*@D@G00bYrPo8ZlXw*cNeb6Df20g9r|GuN4`FE<3#n`p?u@Ukv1yP=Jxxi zWn#?d?@slVab*y=vTGt-{Mox2{?OZZ^(c-bwD6v9^L!$WANI{B?=C-#-E?xoTNahp z@TXU>F^D*_WP!=RAPcw8EU*lsmm^p#WYwu;P_3btu)Rl*a9TCHB~tmWuH?xIH9NbT zn{^u(18jx8h{w9oa2SQAgkyV7-F9o6^+wC&u-mlj8;-e!Qlg~S3`TuFY$BE_QDIl< z3QoX9qX*bsd)(R62yv(84gIiFi{o`^WXFyqcKe;}$n!hW^P*69VzyT$-l8fZi$;;0 zPNH-)O3-{qcM}%t@E1eQX%Y=)x~D@X={SK$w_vD0FJWk7KOP&vwb+<1Mg69vlob`eww26Le1 zL6u>!0O}g0F%2%l87{m5XQ*})aIKetx43W#Y=^-!1lg1?nlQ)RSB(SpM#gbfl5@Hm zL|qvSmFLSYIY>2(5N9&~MBx&d$9LcaOHc-u2l&bY5`3D27vUmUmNlNifzX1N)SH3j z)BL%G9Gv99WZ@)F%diwprPd%%lQffo(*nGC3?~Ix|MfdKorMz%1_d~o1uqZF^eUvU zS$v^294Nwa57QG9^|#;Q#n|Bz58z^_LP+QimM`HbnRE}77QHADLupu!LNUQfj5KDB zFb7H)-vmm?&=beFswAeKSZb|2apX(ZWb{O|KTus$6}2Fkn3jnWS{|XU9||b~UmFqi z1ZLeRF#3{Bsl{_;ByKF3dTF!L*sQLK4Rl$_?!o!$Rq28FMRSu%pq8~*b88Qccc$h{*uv{|cYk?T03ngNL5j+(4#lr^=zOGIb z^*4yJQ?J=;&&CDu$(0Y6#ZV5FrfoMez59=Nh``o&i81Di*dVe<^T(CDdL@m8MXVD( zDuPcZlTRhc&tfy}NxiWyu5<$@D_miy)^L?uSNo$r*J@Ak@y0eyV$;#b<1u=u5B_S?dn|7Oaw0w3f2Btg`hWTecb% zI`Irq;JQSz>+<2~y2HpD1=zJ0NrBFTRx(mtV&lXg%H$ZY8hjB+7{(15Xk`{quZQ=C zec3&9xx_J2vfEX$(QYq^hHR@5g{g8EPvgYj9~q@x6Y;kxdBz;mIo-rA^P8jx60=Fo zGh^aC;|JQ%26W6FZ0n7+-Sw@;rn|k>*lq4^Iooa%&v=^*agzb zf+?0hGF`l_AE6tX4zIkG{uTNCWj?*@G*TCdDVqYfSE=EQA-vPO1%gjkE^U8{Lma9} zWT*q**f;<-<+S~f=BOS|-E0hjFa;OhgAk&P+TKpfeO`O%Hg}y?-FD0uSF7P2%+NPJ zU}>}7a%(#~Zf&i#i^jhCu;$kD^{1}0*KF?EE&CqoUF9Gv+qD)_Zp4ReZa3XjDZRQJ$wBG> literal 0 HcmV?d00001 diff --git a/resources/scrapers/kinopoisk/common.py b/resources/scrapers/kinopoisk/common.py new file mode 100644 index 0000000..a5ef6a2 --- /dev/null +++ b/resources/scrapers/kinopoisk/common.py @@ -0,0 +1,382 @@ +# -*- coding: utf-8 -*- +# +# Russian metadata plugin for Plex, which uses http://www.kinopoisk.ru/ to get the tag data. +# Плагин для обновления информации о фильмах использующий КиноПоиск (http://www.kinopoisk.ru/). +# Copyright (C) 2012 Yevgeny Nyden +# +# This program 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 2 +# of the License, or (at your option) any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# @author zhenya (Yevgeny Nyden) +# @revision 148 + +import sys +import math +import difflib + +import translit +import LOGGER as Log +from HTTP import * + + +USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22' +# USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22' +ENCODING_PLEX = 'utf-8' + +SCORE_PENALTY_ITEM_ORDER = 2 +SCORE_PENALTY_YEAR = 30 +SCORE_PENALTY_TITLE = 40 + +IMAGE_SCORE_MAX_NUMBER_OF_ITEMS = 5 +IMAGE_SCORE_ITEM_ORDER_BONUS_MAX = 25 +IMAGE_SCORE_RESOLUTION_BONUS_MAX = 25 +IMAGE_SCORE_RATIO_BONUS_MAX = 45 +IMAGE_SCORE_THUMB_BONUS = 5 +POSTER_SCORE_MIN_RESOLUTION_PX = 60 * 1000 +POSTER_SCORE_MAX_RESOLUTION_PX = 600 * 1000 +POSTER_SCORE_BEST_RATIO = 0.7 +ART_SCORE_BEST_RATIO = 1.5 +ART_SCORE_MIN_RESOLUTION_PX = 200 * 1000 +ART_SCORE_MAX_RESOLUTION_PX = 1000 * 1000 + + +class Preferences: + """ These instance variables are populated from plugin preferences. + """ + + def __init__(self, + (maxPostersName, maxPostersDefault), + (maxArtName, maxArtDefault), + (getAllActorsName, getAllActorsDefault), + (imdbSupportName, imdbSupportDefault), + (cacheTimeName, cacheTimeDefault), + (imdbRatingName, imdbRatingDefault), + (additionalRatingName, additionalRatingDefault)): + self.maxPostersName = maxPostersName + self.maxPosters = maxPostersDefault + self.maxArtName = maxArtName + self.maxArt = maxArtDefault + self.getAllActorsName = getAllActorsName + self.getAllActors = getAllActorsDefault + self.imdbSupportName = imdbSupportName + self.imdbSupport = imdbSupportDefault + self.cacheTimeName = cacheTimeName + self.cacheTime = cacheTimeDefault + self.cacheTimeDefault = cacheTimeDefault + self.imdbRatingName = imdbRatingName + self.imdbRating = imdbRatingDefault + self.additionalRatingName = additionalRatingName + self.additionalRating = additionalRatingDefault + + def readPluginPreferences(self): + # Setting image (poster and funart) preferences. + if self.maxPostersName is not None: + self.maxPosters = int(Prefs[self.maxPostersName]) + Log.Debug('PREF: Max poster results is set to %d.' % self.maxPosters) + if self.maxArtName is not None: + self.maxArt = int(Prefs[self.maxArtName]) + Log.Debug('PREF: Max art results is set to %d.' % self.maxArt) + if self.getAllActorsName is not None: + self.getAllActors = Prefs[self.getAllActorsName] + Log.Debug('PREF: Parse all actors is set to %s.' % str(self.getAllActors)) + + # Setting IMDB support. + if self.imdbSupportName is not None: + self.imdbSupport = Prefs[self.imdbSupportName] + Log.Debug('PREF: IMDB support is set to %s.' % str(self.imdbSupport)) + + # Setting cache expiration time. + if self.cacheTimeName is not None: + self.cacheTime = parseAndSetCacheTimeFromPrefs(self.cacheTimeName, self.cacheTimeDefault) + + # Setting IMDB rating. + if self.imdbRatingName is not None: + self.imdbRating = Prefs[self.imdbRatingName] + Log.Debug('PREF: IMDB rating is set to %s.' % str(self.imdbRating)) + + # Setting kinopoisk.ru rating. + if self.additionalRatingName is not None: + self.additionalRating = Prefs[self.additionalRatingName] + Log.Debug('PREF: kinopoisk rating is set to %s.' % str(self.additionalRating)) + + +def getElementFromHttpRequest(url, encoding, userAgent=USER_AGENT): + """ Fetches a given URL and returns it as an element. + Функция преобразования html-кода в xml-код. + """ + for i in range(3): + errorCount = 0 + try: + req = HTTPRequest(url, headers={'User-agent': userAgent, 'Accept': 'text/html'}) + response = HTTP().fetch(req) + return str(response.body).decode(encoding) + except: + errorCount += 1 + Log.Debug('Error fetching URL: "%s".' % url) + time.sleep(1 + errorCount) + return None + + +def requestImageJpeg(url, userAgent): + """ Requests an image given its URL and returns a request object. + """ + try: + response = HTTP.Request(url, headers={ + 'User-agent': userAgent, + 'Accept': 'image/jpeg' + }) + return response + except: + Log.Debug('Error fetching URL: "%s".' % url) + return None + + +def getWin1252ResponseFromHttpRequest(url): + """ Requests an image given its URL and returns a request object. + """ + try: + response = HTTP.Request(url, headers={ + 'User-agent': USER_AGENT, + 'Accept-Charset': 'ISO-8859-1;q=0.7,*;q=0.3', + 'Accept-Language': 'en-US,en;q=0.8' + }) + return response + except: + Log.Error('Error fetching URL: "%s".' % url) + return None + + +def printSearchArrayResults(results): + """ Sends a list of media array results to debug log. + """ + Log.Debug('Search produced %d results:' % len(results)) + index = -1 + for result in results: + index += 1 + Log.Debug(' ... %d: id="%s", name="%s", year="%s", score="%d".' % + (index, result[0], result[1], str(result[2]), result[3])) + + +def printSearchResults(results): + """ Sends a list of media results to debug log. + """ + Log.Debug('Search produced %d results:' % len(results)) + index = 0 + for result in results: + Log.Debug(' ... %d: id="%s", name="%s", year="%s", score="%d".' % + (index, result.id, result.name, str(result.year), result.score)) + index += 1 + + +def printImageSearchResults(thumbnailList): + Log.Debug('printing %d image results:' % len(thumbnailList)) + index = 0 + for result in thumbnailList: + Log.Debug(' ... %d: index=%s, score=%s, URL="%s".' % + (index, result.index, result.score, result.url)) + index += 1 + return None + + +def logException(msg): + excInfo = sys.exc_info() + Log.Exception('%s; exception: %s; cause: %s' % (msg, excInfo[0], excInfo[1])) + + +def scoreMediaTitleMatch(mediaName, mediaYear, title, altTitle, year, itemIndex): + """ Compares page and media titles taking into consideration + media item's year and title values. Returns score [0, 100]. + Search item scores 100 when: + - it's first on the list of results; AND + - it equals to the media title (ignoring case) OR all media title words are found in the search item; AND + - search item year equals to media year. + + For now, our title scoring is pretty simple - we check if individual words + from media item's title are found in the title from search results. + We should also take into consideration order of words, so that "One Two" would not + have the same score as "Two One". Also, taking into consideration year difference. + """ + # TODO(zhenya): add logging that works in unit tests. + # Log.Debug('comparing item %d::: "%s-%s" with "%s-%s" (%s)...' % + # (itemIndex, str(mediaName), str(mediaYear), str(title), str(year), str(altTitle))) + # Max score is when both title and year match exactly. + score = 100 + + # Item order penalty (the lower it is on the list or results, the larger the penalty). + score = score - (itemIndex * SCORE_PENALTY_ITEM_ORDER) + + # Compute year penalty: [equal, diff>=3] --> [0, MAX]. + yearPenalty = SCORE_PENALTY_YEAR + mediaYear = toInteger(mediaYear) + year = toInteger(year) + if mediaYear is not None and year is not None: + yearDiff = abs(mediaYear - year) + if not yearDiff: + yearPenalty = 0 + elif yearDiff == 1: + yearPenalty = 15 + elif yearDiff == 2: + yearPenalty = 25 + score = score - yearPenalty + #print str(mediaYear)+' '+str(year)+' '+str(yearPenalty) + + # Compute title penalty. + titlePenalty = computeTitlePenalty(mediaName, title) + altTitlePenalty = 100 + if altTitle is not None: + altTitlePenalty = computeTitlePenalty(mediaName, altTitle) + + # Get detranlitirated media name (in case filename is in latin characters), + # compare it's score with the original, and pick the min. + try: + altMediaName = translit.detranslify(mediaName) + detranslifiedTitlePenalty = computeTitlePenalty(altMediaName, title) + titlePenalty = min(detranslifiedTitlePenalty, titlePenalty) + if altTitle is not None: + detranslifiedAltTitlePenalty = computeTitlePenalty(altMediaName, altTitle) + altTitlePenalty = min(detranslifiedAltTitlePenalty, altTitlePenalty) + except: + pass + + titlePenalty = min(titlePenalty, altTitlePenalty) + score = score - titlePenalty + + # If the score is not high enough, add a few points to the first result - + # let's give KinoPoisk some credit :-). + if itemIndex == 0 and score <= 80: + score = score + 5 + + # IMPORTANT: always return an int. + score = int(score) + # Log.Debug('***** title scored %d' % score) + return score + + +def scoreThumbnailResult(thumb, isPoster): + """ Given a Thumbnail object that represents an poster or a funart result, + scores it, and stores the score on the passed object (thumb.score). + """ + score = 0 + if thumb.url is None: + thumb.score = 0 + return + + if thumb.index < IMAGE_SCORE_MAX_NUMBER_OF_ITEMS: + # Score bonus from index for items below 10 on the list. + bonus = IMAGE_SCORE_ITEM_ORDER_BONUS_MAX * \ + ((IMAGE_SCORE_MAX_NUMBER_OF_ITEMS - thumb.index) / float(IMAGE_SCORE_MAX_NUMBER_OF_ITEMS)) + score += bonus + + if thumb.width is not None and thumb.height is not None: + # Get a resolution bonus if width*height is more than a certain min value. + if isPoster: + minPx = POSTER_SCORE_MIN_RESOLUTION_PX + maxPx = POSTER_SCORE_MAX_RESOLUTION_PX + bestRatio = POSTER_SCORE_BEST_RATIO + else: + minPx = ART_SCORE_MIN_RESOLUTION_PX + maxPx = ART_SCORE_MAX_RESOLUTION_PX + bestRatio = ART_SCORE_BEST_RATIO + pixelsCount = thumb.width * thumb.height + if pixelsCount > minPx: + if pixelsCount > maxPx: + pixelsCount = maxPx + bonus = float(IMAGE_SCORE_RESOLUTION_BONUS_MAX) * \ + float((pixelsCount - minPx)) / float((maxPx - minPx)) + score += bonus + + # Get an orientation (Portrait vs Landscape) bonus. (we prefer images that are have portrait orientation. + ratio = thumb.width / float(thumb.height) + ratioDiff = math.fabs(bestRatio - ratio) + if ratioDiff < 0.5: + bonus = IMAGE_SCORE_RATIO_BONUS_MAX * (0.5 - ratioDiff) * 2.0 + score += bonus + + # Get a bonus if image has a separate thumbnail URL. + if thumb.thumbUrl is not None and thumb.url != thumb.thumbUrl: + score += IMAGE_SCORE_THUMB_BONUS + + thumb.score = int(score) + + +def isAsciiString(mediaName): + """ Returns True if all characters of the string are ASCII. + """ + for index, char in enumerate(mediaName): + if ord(char) >= 128: + return False + return True + + +def toInteger(maybeNumber): + """ Returns the argument converted to an integer if it represents a number + or None if the argument is None or does not represent a number. + """ + try: + if maybeNumber is not None and str(maybeNumber).strip() != '': + return int(maybeNumber) + except: + pass + return None + + +def computeTitlePenalty(mediaName, title): + """ Given media name and a candidate title, returns the title result score penalty. + @param mediaName Movie title parsed from the file system. + @param title Movie title from the website. + """ + mediaName = mediaName.lower() + title = title.lower() + if mediaName != title: + # First approximate the whole strings. + diffRatio = difflib.SequenceMatcher(None, mediaName, title).ratio() + penalty = int(SCORE_PENALTY_TITLE * (1 - diffRatio)) + + # If the penalty is more than 1/2 of max title penalty, check to see if + # this title starts with media name. This means that media name does not + # have the whole name of the movie - very common case. For example, media name + # "Кавказская пленница" for a movie title "Кавказская пленница, или Новые приключения Шурика". + if penalty >= 15: # This is so that we don't have to do the 'split' every time. + # Compute the scores of the + # First, check if the title starts with media name. + mediaNameParts = mediaName.split() + titleParts = title.split() + if len(mediaNameParts) <= len(titleParts): + i = 0 + # Start with some small penalty, value of which depends on how + # many words media name has relative to the title's word count. + penaltyAlt = max(5, int(round((1.0 - (float(len(mediaNameParts)) / len(titleParts))) * 15 - 5))) + penaltyPerPart = SCORE_PENALTY_TITLE / len(mediaNameParts) + for mediaNamePart in mediaNameParts: + partDiffRatio = difflib.SequenceMatcher(None, mediaNamePart, titleParts[i]).ratio() + penaltyAlt = penaltyAlt + int(penaltyPerPart * (1 - partDiffRatio)) + i = i + 1 + penalty = min(penalty, penaltyAlt) + # print '++++++ DIFF("%s", "%s") = %g --> %d' % (mediaName.encode('utf8'), title.encode('utf8'), diffRatio, penalty) + # Log.Debug('++++++ DIFF("%s", "%s") = %g --> %d' % (mediaName.encode('utf8'), title.encode('utf8'), diffRatio, penalty)) + return penalty + return 0 + + +class HttpUtils(): + def __init__(self, encoding, userAgent): + self.encoding = encoding + self.userAgent = userAgent + + def requestAndParseHtmlPage(self, url): + return getElementFromHttpRequest(url, self.encoding, self.userAgent) + + def requestImageJpeg(self, url): + return requestImageJpeg(url, self.userAgent) diff --git a/resources/scrapers/kinopoisk/common.pyo b/resources/scrapers/kinopoisk/common.pyo new file mode 100644 index 0000000000000000000000000000000000000000..533c0385610a02b42e8a16c39e7f8c74abda2bd8 GIT binary patch literal 13067 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 T{Oiqi=B9ENa=Bbz?ydg@E?iV0 literal 0 HcmV?d00001 diff --git a/resources/scrapers/kinopoisk/kinopoisk.pyo b/resources/scrapers/kinopoisk/kinopoisk.pyo new file mode 100644 index 0000000000000000000000000000000000000000..a9c63b1c201c26950aa37d863e8d4c9e0014336b GIT binary patch literal 26405 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/kinopoisk/pageparser.py b/resources/scrapers/kinopoisk/pageparser.py new file mode 100644 index 0000000..d6ea9ac --- /dev/null +++ b/resources/scrapers/kinopoisk/pageparser.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +# +# Russian metadata plugin for Plex, which uses http://www.kinopoisk.ru/ to get the tag data. +# Плагин для обновления информации о фильмах использующий КиноПоиск (http://www.kinopoisk.ru/). +# Copyright (C) 2013 Yevgeny Nyden +# +# This program 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 2 +# of the License, or (at your option) any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# @author zhenya (Yevgeny Nyden) +# @version 1.52 +# @revision 148 + +import re +import urllib +import operator + +import common +import pluginsettings as S +import translit + + +# MATCHER_MOVIE_DURATION = re.compile('\s*(\d+).*?', re.UNICODE | re.DOTALL) +#MATCHER_IMDB_RATING = re.compile('IMDb:\s*(\d+\.?\d*)\s*\(\s*([\s\d]+)\s*\)', re.UNICODE | re.DOTALL) +#MATCHER_IMDB_RATING = re.compile('IMDb:\s*(\d+\.?\d*)\s?\((.*)\)', re.UNICODE) + +USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22' +''' +MOVIE_THUMBNAIL_SMALL_WIDTH = 130 +MOVIE_THUMBNAIL_SMALL_HEIGHT = 168 +MOVIE_THUMBNAIL_BIG_WIDTH = 780 +MOVIE_THUMBNAIL_BIG_HEIGHT = 1024 + +# Compiled regex matchers. +MATCHER_WIDTH_FROM_STYLE = re.compile('.*width\s*:\s*(\d+)px.*', re.UNICODE) +MATCHER_HEIGHT_FROM_STYLE = re.compile('.*height\s*:\s*(\d+)px.*', re.UNICODE) +MATCHER_LEADING_NONALPHA = re.compile('^[\s\d\.\(\)]*', re.UNICODE | re.MULTILINE) + + +# Русские месяца, пригодятся для определения дат. +RU_MONTH = { + u'января': '01', + u'февраля': '02', + u'марта': '03', + u'апреля': '04', + u'мая': '05', + u'июня': '06', + u'июля': '07', + u'августа': '08', + u'сентября': '09', + u'октября': '10', + u'ноября': '11', + u'декабря': '12' +} +''' + + +class PageParser: + def __init__(self, logger, httpUtils=common.HttpUtils(S.ENCODING_KINOPOISK_PAGE, USER_AGENT), isDebug=False): + self.log = logger + self.isDebug = isDebug + self.httpUtils = httpUtils + + def fetchAndParseSearchResults(self, mediaName, mediaYear, mediaAltName=None): + """ Searches for movie titles on KinoPoisk. + @param mediaName Movie title parsed from a filename. + @param mediaName Movie year parsed from a filename. + @return Array of tuples: [kinoPoiskId, title, year, score] + """ + self.log.Info('Quering kinopoisk...') + results = self.queryKinoPoisk(mediaName, mediaYear) + + # Check media name is all ASCII characters, and if it is, + # issue another query to KinoPoisk using a translified media name; + # lastly, merge the scored results. + if common.isAsciiString(mediaName): + translifiedMediaName = translit.detranslify(mediaName) + moreResults = self.queryKinoPoisk(translifiedMediaName, mediaYear) + resultsMap = dict() + for result in results: + resultsMap[result[0]] = result + results = [] # Recreate and repopulate the results array removing duplicates. + for result in moreResults: + currId = result[0] + if currId in resultsMap.keys(): + origResult = resultsMap[currId] + del resultsMap[currId] + if result[3] >= origResult[3]: + results.append(result) + else: + results.append(origResult) + else: + results.append(result) + results.extend(resultsMap.viewvalues()) + + if mediaAltName: + moreResults = self.queryKinoPoisk(mediaAltName, mediaYear) + resultsMap = dict() + for result in results: + resultsMap[result[0]] = result + results = [] # Recreate and repopulate the results array removing duplicates. + for result in moreResults: + currId = result[0] + if currId in resultsMap.keys(): + origResult = resultsMap[currId] + del resultsMap[currId] + if result[3] >= origResult[3]: + results.append(result) + else: + results.append(origResult) + else: + results.append(result) + results.extend(resultsMap.viewvalues()) + + # Sort all results based on their score. + results.sort(key=operator.itemgetter(3)) + results.reverse() + if self.isDebug: + self.log.Debug('Search produced %d results:' % len(results)) + index = -1 + for result in results: + index += 1 + self.log.Debug(' ... %d: id="%s", name="%s", year="%s", score="%d".' % + (index, result[0], result[1], str(result[2]), result[3])) + return results + + def queryKinoPoisk(self, mediaName, mediaYear): + """ Ищет фильм на кинопоиске. + Returns title results as they are returned (no sorting is done here!). + """ + results = [] + try: + encodedName = urllib.quote(mediaName.encode(S.ENCODING_KINOPOISK_PAGE)) + except: + encodedName = urllib.quote(mediaName.encode('utf-8')) + page = self.httpUtils.requestAndParseHtmlPage(S.KINOPOISK_SEARCH_SIMPLE % encodedName) + if page is None: + self.log.Warn(' ### nothing was found on kinopoisk for media name "%s"' % mediaName) + return results + + # Страница получена, берем с нее перечень всех названий фильмов. + self.log.Debug('**** Finding %s (%s) got a KinoPoisk...' % (mediaName, mediaYear)) + + reobj = re.compile(r'(.+?)
      (.+?)') + result = reobj.findall(page) + + # Inspect query results titles and score them. + self.log.Debug('found %d results (div info tags)' % len(result)) + itemIndex = -1 + for itemKinoPoiskId, itemTitleitemYear, itemAltTitle in result: + itemIndex = itemIndex + 1 + itemAltTitle = itemAltTitle.replace(' ', '') + try: + itemTitle, itemYear = re.compile('^(.+?), (\d\d\d\d)$').findall(itemTitleitemYear.strip())[0] + except: + itemYear = None + itemTitle = itemTitleitemYear + itemScore = common.scoreMediaTitleMatch(mediaName, mediaYear, itemTitle, itemAltTitle, itemYear, itemIndex) + results.append([itemKinoPoiskId, itemTitle, itemYear, itemScore]) + + return results + + diff --git a/resources/scrapers/kinopoisk/pageparser.pyo b/resources/scrapers/kinopoisk/pageparser.pyo new file mode 100644 index 0000000000000000000000000000000000000000..d500428f24f9de8a6ff05bbff80bcf0882d0c0fc GIT binary patch literal 4366 zcmc&%&2JmW6`v(3>f4e(;#6)DP2{SjVwJLGrw(MGXNQYJif}#a_=%M`s0`$^DF9FhzwCCQWOOL(uUKHr5=%M|+w3wO-wVRfn|eEcUFKH2 zauC_rY~PVfkyW8YgM3_&AIKZmOYf9!PRO}NBUBq|YdNq}Z{NI~pPrVv<%jDlk0xap z>?rv_m3QI^Ilryrx|*7X)%=Z{-@28*aeG=8yo#rTmYVIu3A?IMsYK~H4sR-k$?Z$s#7SvX=YI{-Nwzl!a2BG0;EKOll zSg{mbjIS!~lB!Gd=I|tiL2kwTOz{aEHpMx=9z;b1biuP;(TzQb)#7sO2Sv~KCD~|0F zwQNf~>SBG2MCMx<##rOzmWa{wr(uqOY%2yGypxV&o9J0Dn7OLjRfOt3eZLaAo(O zZMiRzKW@vd{*T25DX_&_KTSny5$_ZIw{|G7XTFqccbzZi+8-SX%>Quh*UpQs{i!Xt zT-$2PE!Vc3|Ku7R9w3ykgQ9khLIXoT6^O>;flRL!Nb_g6eB+? zj{3#^I<+l4UE&g$jRj;n(%9)Q*J=;osTie!V?rbVPocyn z;Ak4Fa|DtuK|Di$XA_-CA0kGUMseRJcxX?|1z283OuYRTi%|Fe5Ukd|F!&jgkFPdjS$&k z=R((zGvr(V2MwakqU^(epVRGJa)wjGsq@a|RQA93r$;cp*SXTt9&m0sWlGx+9^$-t zJmx3Zn#3w;aWE<@vl?g%be2#U0i8pfvk{E~@SNvIB;Oji~=d69e@b#U?#1kl3r|@+907X%>)+B5(dL0iI}CM z2fQ63o#M}E{h~H3e8|1b#r@)7QnaRIo}kJ4 zMD0AmJWTujVx$Pp9uP-^2+BnY3Y>$0QD~(=0QYNv?BvQcz<7>sunZUg))1XbOxEZ^ z`#Di%-<;jQfLjrY93g=D5ej+o^V1)me0ur=dHU?+vyqyX z_a}eA^V#Y5A%FTJ8oLapCV|T~s!0zG+v-4iTA_{L7O0ntVrg*t2{Z#EajjBvTWR&? z#F?21l!Th*8_<0VA9){# zk#xt6%#E7~S&gmqo};FG-mGEltZ8`By;)CgYgM^BMpw$2si}G~-&ly`4-OUtRY$d-(R(PXV>STA#auqOjRv$S5-OgsnubQS!1v}GE1 zu=A0XizvR!_9rE#OTH6dV|rQ5y@FoGpr#JPV2eR#w;5ZN0C7}~f!xFe1^X(>#nt)8 z3rnjHO3O>DkJlbA6_!hDa}O5zR?Gvm0!O%G#qv z2KH5C@QiadJRP|-pCv*<*1PcsvT1N;cFa}?;_@Di!OrG?NDH`6FYChMe~ zQ9Q3XBhCOIK9jzZ0s*86ye~8Kr=3akXHkE{c|Entgxh*`p_@pl#I#r{)p3;xAtouK zX&$!U!`!zZxz|we*e8WWw}kz+y3U!n?}eaw+VF0kig7AP|13;g`@g@Sxmbg^kB48( zvd$Y_1MenlqSd+AsUTc&=>n0sO*gFM#n9j;1Dr95?|e%k-ea3D+c8exY?82hbZ88% OdjK0?AjM^OcJ$xa_#37G literal 0 HcmV?d00001 diff --git a/resources/scrapers/kinopoisk/pluginsettings.py b/resources/scrapers/kinopoisk/pluginsettings.py new file mode 100644 index 0000000..29c3100 --- /dev/null +++ b/resources/scrapers/kinopoisk/pluginsettings.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +# +# Global definitions for KinoPoiskRu plugin. +# Copyright (C) 2013 Yevgeny Nyden +# +# This program 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 2 +# of the License, or (at your option) any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# @author zhenya (Yevgeny Nyden) +# @version 1.52 +# @revision 148 + +# Default plugin preferences. When modifying, please also change +# corresponding values in the ../DefaultPrefs.json file. +KINOPOISK_PREF_DEFAULT_MAX_POSTERS = 1 +KINOPOISK_PREF_DEFAULT_MAX_ART = 2 +KINOPOISK_PREF_DEFAULT_GET_ALL_ACTORS = False +KINOPOISK_PREF_DEFAULT_IMDB_SUPPORT = True +KINOPOISK_PREF_DEFAULT_IMDB_RATING = False +KINOPOISK_PREF_DEFAULT_KP_RATING = False + +ENCODING_KINOPOISK_PAGE = 'cp1251' + +# Разные страницы сайта. +KINOPOISK_SITE_BASE = 'http://www.kinopoisk.ru/' +KINOPOISK_RESOURCE_BASE = 'http://st.kinopoisk.ru/' +KINOPOISK_TITLE_PAGE_URL = KINOPOISK_SITE_BASE + 'film/%s/' +KINOPOISK_CAST_PAGE_URL = KINOPOISK_SITE_BASE + 'film/%s/cast/' +KINOPOISK_STUDIO_PAGE_URL = KINOPOISK_SITE_BASE + 'film/%s/studio/' +KINOPOISK_THUMBNAIL_BIG_URL = KINOPOISK_RESOURCE_BASE + 'images/film_big/%s.jpg' +KINOPOISK_THUMBNAIL_SMALL_URL = KINOPOISK_RESOURCE_BASE + 'images/film/%s.jpg' +KINOPOISK_POSTERS_URL = KINOPOISK_SITE_BASE + 'film/%s/posters/page/%d/' +KINOPOISK_STILLS_URL = KINOPOISK_SITE_BASE + 'film/%s/stills/page/%d/' + +# Страница поиска. +KINOPOISK_SEARCH = KINOPOISK_SITE_BASE + 'index.php?first=no&kp_query=%s' +KINOPOISK_SEARCH_SIMPLE = 'http://m.kinopoisk.ru/search/%s/' \ No newline at end of file diff --git a/resources/scrapers/kinopoisk/pluginsettings.pyo b/resources/scrapers/kinopoisk/pluginsettings.pyo new file mode 100644 index 0000000000000000000000000000000000000000..f2de660a73fe62e0aba76b3d2e523669e77903b5 GIT binary patch literal 1238 zcmaKr(N5bi6oy?21quZQ+t@U1LPMRnYQ&`7ps_7&Ly1V6D0U9#V#jXl( zv8UVvY%j3mtdO=+Y1EV7{{C}(oH)h5mGYmv-)x5I)(3rs9GMs!v&h(B-EeKb?wKAp27CGfkUJCbipml<*`L zx3zSviNhQUxxhAn-Nb{TRu!74%nZ7rkeW~{K4Lj$aiWQrFc%NQUL-Vy==Zn>*|i_M zC-&#j!?fz|p$bogj8dU-D4&@*G_9J%lT>V>`Bquc+f17qn?y=$=JrTfe4`jfvr6 zsTO_0rn^M0f#o6`h)7nKn_C8Oe8-xz<8rL&qd%ujdjm@tUTc(>HUJTzc(#M>j26H(Ocdw@Wx~s|T&telh2mzS4}S zBapX@iD_9l1AFtp(A~!6!X9uoNwL{>EaL?HC=bGeVdE_D1RU!?XTx|D=$to083t|= z!mt-y*V~OCWGoqpKy=fX%i8c>^plAQ9zWH955~QC1ZPS@im35>sXorn!-S0o(HHe- UggO$X!sE44Dk@!`y^7_+KaxT{jQ{`u literal 0 HcmV?d00001 diff --git a/resources/scrapers/kinopoisk/translit.py b/resources/scrapers/kinopoisk/translit.py new file mode 100644 index 0000000..11a8762 --- /dev/null +++ b/resources/scrapers/kinopoisk/translit.py @@ -0,0 +1,288 @@ +# -*- coding: utf-8 -*- +# -*- test-case-name: pytils.test.test_translit -*- +# pytils - simple processing for russian strings +# Copyright (C) 2006-2007 Yury Yurevich +# +# http://www.pyobject.ru/projects/pytils/ +# +# This program 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, version 2 +# of the License. +# +# This program 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. +""" +Simple transliteration +""" + +# __id__ = __revision__ = "$Id: translit.py 102 2007-07-12 12:33:36Z the.pythy $" +#__url__ = "$URL: https://pythy.googlecode.com/svn/tags/pytils/0_2_2/pytils/translit.py $" + +import re +import sys + + +TRANSTABLE = ( + (u"'", u"'"), + (u'"', u'"'), + (u"‘", u"'"), + (u"’", u"'"), + (u"«", u'"'), + (u"»", u'"'), + (u"–", u"-"), + (u"…", u"..."), + (u"№", u"#"), + ## верхний регистр + # трехбуквенные замены + (u"Щ", u"Sch"), + # при замене русский->английский будет первая замена, + # т.е. Sch + # а вот если английский->русский, то вариант SCH и Sch -- + # оба пройдут + (u"Щ", u"SCH"), + # двухбуквенные замены + (u"Ё", u"Yo"), + (u"Ё", u"YO"), + (u"Ж", u"Zh"), + (u"Ж", u"ZH"), + (u"Ц", u"Ts"), + (u"Ц", u"TS"), + (u"Ч", u"Ch"), + (u"Ч", u"CH"), + (u"Ш", u"Sh"), + (u"Ш", u"SH"), + (u"Ы", u"Yi"), + (u"Ы", u"YI"), + (u"Ю", u"Yu"), + (u"Ю", u"YU"), + (u"Я", u"Ya"), + (u"Я", u"YA"), + (u"ИЙ", u"IY"), + # однобуквенные замены + (u"А", u"A"), + (u"Б", u"B"), + (u"В", u"V"), + (u"Г", u"G"), + (u"Д", u"D"), + (u"Е", u"E"), + (u"З", u"Z"), + (u"И", u"I"), + (u"Й", u"J"), + (u"К", u"K"), + (u"Л", u"L"), + (u"М", u"M"), + (u"Н", u"N"), + (u"О", u"O"), + (u"П", u"P"), + (u"Р", u"R"), + (u"С", u"S"), + (u"Т", u"T"), + (u"У", u"U"), + (u"Ф", u"F"), + (u"Х", u"H"), + (u"Э", u"E"), + (u"Ъ", u"`"), + (u"Ы", u"Y"), + (u"Ь", u"'"), + ## нижний регистр + # трехбуквенные замены + (u"щ", u"sch"), + # двухбуквенные замены + (u"ё", u"yo"), + (u"ж", u"zh"), + (u"ц", u"ts"), + (u"ч", u"ch"), + (u"ш", u"sh"), + (u"ы", u"yi"), + (u"ю", u"yu"), + (u"я", u"ya"), + (u"я", u"ja"), + (u"ий", u"iy"), + # однобуквенные замены + (u"а", u"a"), + (u"б", u"b"), + (u"в", u"v"), + (u"г", u"g"), + (u"д", u"d"), + (u"е", u"e"), + (u"з", u"z"), + (u"и", u"i"), + (u"й", u"j"), + (u"к", u"k"), + (u"л", u"l"), + (u"м", u"m"), + (u"н", u"n"), + (u"о", u"o"), + (u"п", u"p"), + (u"р", u"r"), + (u"с", u"s"), + (u"т", u"t"), + (u"у", u"u"), + (u"ф", u"f"), + (u"х", u"h"), + (u"э", u"e"), + (u"ъ", u"`"), + (u"ь", u"'"), + # для полноты английского алфавит (в slugify) + # дополняем английскими буквами, которых + # не в парах + (u"c", u"c"), + (u"q", u"q"), + (u"y", u"y"), + (u"x", u"x"), + (u"w", u"w"), + (u"1", u"1"), + (u"2", u"2"), + (u"3", u"3"), + (u"4", u"4"), + (u"5", u"5"), + (u"6", u"6"), + (u"7", u"7"), + (u"8", u"8"), + (u"9", u"9"), + (u"0", u"0"), +) #: Translation table + +RU_ALPHABET = [x[0] for x in TRANSTABLE] #: Russian alphabet that we can translate +EN_ALPHABET = [x[1] for x in TRANSTABLE] #: English alphabet that we can detransliterate +ALPHABET = RU_ALPHABET + EN_ALPHABET #: Alphabet that we can (de)transliterate + + +def translify(in_string): + """ + Translify russian text + + @param in_string: input string + @type in_string: C{unicode} + + @return: transliterated string + @rtype: C{str} + + @raise TypeError: when in_string is not C{unicode} + @raise ValueError: when string doesn't transliterate completely + """ + if not isinstance(in_string, unicode): + raise TypeError("Argument must be unicode, not %s" % type(in_string)) + + translit = in_string + for symb_in, symb_out in TRANSTABLE: + translit = translit.replace(symb_in, symb_out) + + try: + translit = str(translit) + except UnicodeEncodeError: + raise ValueError("Unicode string doesn't transliterate completely, " + \ + "is it russian?") + + return translit + + +def detranslify(in_string): + """ + Detranslify + + @param in_string: input string + @type in_string: C{basestring} + + @return: detransliterated string + @rtype: C{str} + + @raise TypeError: when in_string neither C{str}, no C{unicode} + @raise ValueError: if in_string is C{str}, but it isn't ascii + """ + if not isinstance(in_string, basestring): + raise TypeError("Argument must be basestring, not %s" % type(in_string)) + + # в unicode + try: + russian = unicode(in_string) + except UnicodeDecodeError: + raise ValueError("We expects when in_string is str type," + \ + "it is an ascii, but now it isn't. Use unicode " + \ + "in this case.") + + for symb_out, symb_in in TRANSTABLE: + russian = russian.replace(symb_in, symb_out) + + return russian + + +def slugify(in_string): + """ + Prepare string for slug (i.e. URL or file/dir name) + + @param in_string: input string + @type in_string: C{basestring} + + @return: slug-string + @rtype: C{str} + + @raise TypeError: when in_string isn't C{unicode} or C{str} + @raise ValueError: if in_string is C{str}, but it isn't ascii + """ + if not isinstance(in_string, basestring): + raise TypeError("Argument must be basestring, not %s" % type(in_string)) + try: + u_in_string = unicode(in_string).lower() + except UnicodeDecodeError: + raise ValueError("We expects when in_string is str type," + \ + "it is an ascii, but now it isn't. Use unicode " + \ + "in this case.") + # convert & to "and" + u_in_string = re.sub('\&\;|\&', ' and ', u_in_string) + # replace spaces by hyphen + u_in_string = re.sub('[-\s]+', '-', u_in_string) + # remove symbols that not in alphabet + u_in_string = u''.join([symb for symb in u_in_string if symb in ALPHABET]) + # translify it + out_string = translify(u_in_string) + # remove non-alpha + return re.sub('[^\w\s-]', '', out_string).strip().lower() + + +def dirify(in_string): + """ + Alias for L{slugify} + """ + slugify(in_string) + + +def provide_unicode(stext, encoding, default=u"неизвестно"): + """ + Provide Unicode from text + + @param stext: text + @type stext: C{str} + + @param encoding: encoding if input text + @type encoding: C{str} + + @return: C{unicode} + """ + try: + utext = str(stext).decode(encoding) + except UnicodeDecodeError, err: + utext = default % {'error': err, 'value': u""} + return utext + + +def provide_str(utext, encoding, default="unknown"): + """ + Provide text from Unicode + + @param utext: unicode text + @type utext: C{unicode} + + @param encoding: encoding of output text + @type encoding: C{str} + + @return: C{str} + """ + try: + stext = unicode(utext).encode(encoding) + except UnicodeEncodeError, err: + stext = default % {'error': err, 'value': ""} + return stext diff --git a/resources/scrapers/kinopoisk/translit.pyo b/resources/scrapers/kinopoisk/translit.pyo new file mode 100644 index 0000000000000000000000000000000000000000..418d758461e8ac0f44f582d8989370b5ce8f255c GIT binary patch literal 8322 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 1: + name = search[1] + else: + name = None + results = parser.fetchAndParseSearchResults(orginalname, year, name) + if results and results[0][3] > 70: + return results[0][0] + + def _scraper(self, search, year): + timeout = True + + # если фильм свежий, то кладем в кэш НЕ на долго (могут быть обновления на сайте) + if year and year > time.gmtime(time.time()).tm_year: + timeout = 7 * 24 * 60 * 60 * 4 # 4 week + + movie_id = self._search_movie(search, year) + + if movie_id is None: + # сохраняем пустой результат на 4 week + return 7 * 24 * 60 * 60 * 4, None + + else: + return timeout, movie_id + + def _movie(self, id): + response = self.http.fetch('http://www.kinopoisk.ru/film/' + id + '/', headers=self.headers, + timeout=self.timeout) + if response.error: + return False, None + + html = response.body.decode('windows-1251') + + res = { + 'icon': None, + 'thumbnail': None, + 'properties': { + 'fanart_image': None, + }, + 'info': { + 'count': int(id) + } + } + + # имя, оригинальное имя, девиз, цензура, год, top250 + # runtime - длительность фильма (в отдельную переменную, иначе не видно размер файла) + for tag, reg, cb in ( + ('title', '(.+?)', self.html.string), + ('originaltitle', 'itemprop="alternativeHeadline">([^<]*)', self.html.string), + ('tagline', '

    ', self.html.string), + ('mpaa', 'images/mpaa/([^\.]+).gif', self.html.string), + ('runtime', '', + self.html.string), + ('year', '(.+?)'), + ('writer', u']*>(.+?)'), + ('genre', u'(.+?)') + ): + r = re.compile(reg, re.U | re.S).search(html) + if r: + r2 = [] + for r in re.compile('([^<]+)', re.U).findall(r.group(1)): + r = self.html.string(r) + if r and r != '...': + r2.append(r) + if r2: + res['info'][tag] = u', '.join(r2) + + # актеры + r = re.compile(u'

    В главных ролях:

    (.+?)', re.U | re.S).search(html) + if r: + actors = [] + for r in re.compile('
  • ]+>([^<]+)
  • ', re.U).findall(r.group(1)): + r = self.html.string(r) + if r and r != '...': + actors.append(r) + if actors: + res['info']['cast'] = actors[:] + # res['info']['castandrole'] = actors[:] + + # описание фильма + r = re.compile('
    (.+?)
    ', + re.U).search(html) + if r: + plot = self.html.text(r.group(1).replace('<=end=>', '\n')) + if plot: + res['info']['plot'] = plot + + # IMDB + r = re.compile('IMDb: ([0-9.]+) \(([0-9\s]+)\)', re.U).search(html) + if r: + res['info']['rating'] = float(r.group(1).strip()) + res['info']['votes'] = r.group(2).strip() + + + # премьера + r = re.compile(u'премьера \(мир\)(.+?)
    ', re.U | re.S).search(html) + if r: + r = re.compile(u'data\-ical\-date="([^"]+)"', re.U | re.S).search(r.group(1)) + if r: + data = r.group(1).split(' ') + if len(data) == 3: + i = 0 + for mon in ( + u'января', u'февраля', u'марта', u'апреля', u'мая', u'июня', u'июля', u'августа', u'сентября', + u'октября', u'ноября', u'декабря'): + i += 1 + if mon == data[1]: + mon = str(i) + if len(mon) == 1: + mon = '0' + mon + day = data[0] + if len(day) == 1: + day = '0' + day + res['info']['premiered'] = '-'.join([data[2], mon, day]) + break + + + # постер + r = re.compile(u'onclick="openImgPopup\(([^\)]+)\)', re.U | re.S).search(html) + if r: + poster = r.group(1).replace("'", '').strip() + if poster: + res['thumbnail'] = res['icon'] = 'http://kinopoisk.ru' + poster + + menu = re.compile('
    «(.+?)»
    [^<]+/([^<]+)сценарий
    ', re.U | re.S).search(html) + if r: + studio = [] + for r in re.compile('(.+?)', + re.U).findall(r.group(1)): + r = self.html.string(r) + if r: + studio.append(r) + if studio: + res['info']['studio'] = u', '.join(studio) + + timeout = True + # если фильм свежий, то кладем в кэш НЕ на долго (могут быть обновления на сайте) + if 'year' not in res['info'] or not res['properties']['fanart_image'] \ + or int(res['info']['year']) > time.gmtime(time.time()).tm_year: + timeout = 7 * 24 * 60 * 60 * 4 # 4 week + + return timeout, res diff --git a/resources/scrapers/kinopoisks.pyo b/resources/scrapers/kinopoisks.pyo new file mode 100644 index 0000000000000000000000000000000000000000..94299bf9f8334da4fcd543fa7f1c1095c418e8fc GIT binary patch literal 26468 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 0: + human = h + factor = f + else: + break + if human is None: + return (u'%10.1f %s' % (size, u'byte')).replace(u'.0', u'') + else: + return u'%10.2f %s' % (float(size) / float(factor), human) + + +class HTTPRequest: + def __init__(self, url, method='GET', headers=None, cookies=None, params=None, upload=None, download=None, + progress=False, auth_username=None, auth_password=None, proxy_protocol='http', proxy_host=None, + proxy_port=None, proxy_username=None, proxy_password='', timeout=20.0, redirect=True, gzip=False): + if headers is None: + headers = {} + + self.url = url + self.method = method + self.headers = headers + + self.cookies = cookies + + self.params = params + + self.upload = upload + self.download = download + self.progress = progress + + self.auth_username = auth_username + self.auth_password = auth_password + + self.proxy_protocol = proxy_protocol + self.proxy_host = proxy_host + self.proxy_port = proxy_port + self.proxy_username = proxy_username + self.proxy_password = proxy_password + + self.timeout = timeout + + self.redirect = redirect + + self.gzip = gzip + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, ','.join('%s=%r' % i for i in self.__dict__.iteritems())) + + +class HTTPResponse: + def __init__(self, request): + self.request = request + self.code = None + self.headers = {} + self.error = None + self.body = None + self.filename = None + self.time = time.time() + + def __repr__(self): + args = ','.join('%s=%r' % i for i in self.__dict__.iteritems() if i[0] != 'body') + if self.body: + args += ',body=' + else: + args += ',body=None' + return '%s(%s)' % (self.__class__.__name__, args) + diff --git a/resources/scrapers/net.pyc b/resources/scrapers/net.pyc new file mode 100644 index 0000000000000000000000000000000000000000..903a0be9dc6475bbcc6be53280fcfddb63fed51c GIT binary patch literal 10748 zcmcgyO>7+JdH!aXq_`9*Qv8!B$reM4$*QsbY{O0|%aBFNPGg%^hKyx1R42pT;c}MC zo#lM97Ac4b4EfZihZbmo{^pQFf!uoNskfYR3=jm!t>__ufdK8HK+!{k^m(3dW=RQZ zZz8$#?f3utKF|Ap?`-)$M}}_x*FUb-O#WBK_ia4(KM>UM@l4B@wO-saYhICGGHazG zUN&pxBHm}#`igkJS?e$217>ZYh@UWPCyMx>SsN_k6|+_;;zMR_sED65YbT5Nuvr^6 zv1g)^X^xnB$vnZ7%I3|rQ>KoA(Wc*gY0ML2K3f|#b&QFoCwf_9rjFr;O})~~I?Z*i zR7bGp`1kl*w)2RFSr*o|cA|E6bKP#nt*9ODM7QStp!)qko?EvMzIl1>@w&AWs98(e z8LC~W$F`H$IE#_)L;kl{SMT+<)r(`) z(5kp?1Ioc7v?y-apmK(czf!HB_Zr74;o&3}@z@4}%$O#|^tfM-jR{I-Z<*aMJ$TO? zcqS{GW}j*Hv#eP%k5Lby>SY6_c_Pn8V>@G*GkBQe?aml{?$-^ru^(eC+fy926V>9d zwQ%iP7VUJ<#+bd0om#hJrxES6x{bJf_4BwMC0DZ~O|gYhTIIZbF5v&G#8qmG*X(n+yJAnv0_tVf~ zwC(!y7rmZFHtD9d$gbO38g|%MJIbzh_T5T?xE*If@G{1-Lmb;1_eQ+)2y4YLb8|mn z`OmO-IEUT`2f5jA)^)Byaq>LZvQD>8VLwll2am`J9=!blBM=ss`M6~M%y?|oZ`#;w zclP~-C{;{0WSW3k$z;QM69~!~=8mvCZ~v^aPZ5^vr#Y(F{q_$`Up8j8hfF%`c?V_V zEo73usvqZ_bX-+Vm{*KA!r24LyV3LzV4hKMT%Ctw!rx5Wx?dqY~O-%v( zF|Ao(ueh|5TBE6F(g&*HJyXLgYLrd-L)F0OPxVpO_M9=zGwj)oi}=}m24{+m!alo= zs`OUqHp*38sq#FRfk|V!Y0I9$_osJ0TI_ZfX2~iGvuU*3jcm3sE2KSL7XO@raP~QE zz)x)(EzDL~D9K(k@YEVzyaj>1}PsJfE562C{WLMgp;c= zVA5X}@e_*oY7bHy_o{(2&S3xZG{^+$JTYY6M2h|987J8h2OQ>r2hcZ#POm!-)TCzGzp^pVOS zfJM!5lt9iWi%#+#>8;$6nhNqVE(Yom;W_T-kK8tbU{)kw%aWx931S+Bt(_dKHG3KM>QQT^Ui{hT|gpLMcSz-chD+v$R?`mOQ(4iJf z08jEG)(a6z-~HwTz6 zCV1LBhUGKBA-&!IHuv*=!J5D8xpLSnB%6|%W}Q3_GzbdO(wK|6P8z7=C`gqX;w;R(d6rYvaQUKVI9FKl`5@=OG#n&2ubc}C&zt5; zY=;h5?PW4qUjL#=f3Hc+vVw>0VgVX_jp@AhTv7WKlm20enXj1UrNhjez(iHlvdaS5 zy^mK`Es?XB-*K}2PGo11vD0m3aR;!xwwa_mSL(2MZ_aKc-F7`p_ixQx*(F6QT%H=R zylJSDF_JWX6jFm*@|uWbcHa7zk&qgvK2Ew>bsiaq+8Bd{JJug%EwV?qBMPA02QKai zRHWj}5dRb_a}W{}=ctyr6l^7RpH!w*)?=_LX{dz@fa_a^gjfkSMbwu0z>c?~unzNF zB{A+Rcy_G#l_R)PXW8I7!}W?sdhFTDDHu_sZG<*@^9|9m8w%zSZVsYHkrUIM!os0d zMFLcs+U8);{r2gIY3B>p^C~~Ykj&IsaQ>BaE zByuOc8Ib6>cdhg?{)fF0lni?{T1ea@DkN^G-E|fc(E*(5Vh;T0T!|d;#v(<=SxBhn zZc)ewKRQjwN)bN7!%nshrtuD_0Q|GTV20enapFV~|WZpZRGrEL*Q87)JR08uR3>F|2^|X?crXg>PxBJDBl|H`}7LMxq z!oM*0K_*Z=aMWNpV3jlhUO^7X%k3`jbjbGdOlR`ZWH~7l4i+7pOr-+Jmg0EjilsU) z41lFW*XY9R5re_`ROjuS4<;}^!RqfK5FG2#W(X@o_D6wu+8_P{)UdB3cz*Zr)!v-# z^?Y--fX%Hr3}mS^i*~E%Z2_i-raUrKm2E*qxdRI%OOlq&m{r?K;3^1u3h-m(`Bxdx zgz&$EK=^7znZw>GWA1NKObx2E@6jz^AXSXGFM>SXkQ%cTwOk zu|XLDoG5<41kphQ>~LP%zKx<{ve9&VNq)`uFX-)`m36FgffdTS| zy&*8d40QJ>d>A8Oh;ck+XzUU16iO=Iw08y`jv1t;bp5GOyvPdB4UQSUL!T~~jf=!THLas{#5jhMcVDY0!C$w6VE)GSt2Z{G2f94Kjr}a@vcc8s zU4(~KUSk#af(m*P$VP2+GS&;s?ILMzx5{kGzdq+_l5QbyrBSC9)*}B;5SO3du{;Gq z5+gB@qi{>1d-Jpz*6@<-80F(nF`s|O(}VgAfEW6%sD^)4N?(!K>*9L)Z!9lQ- z)VnPted;Hl6P8m;mo?dhK9zt^Ch;kQJ_kBnmtrsawVID14R4QH92PZLsaDS8nXO!^ z3|B^czM!nJ6933`cktMc5JbhRTZr<}Po%3Jb0Dm}B1m-EM16*(c$0ft@59}j+yTC> zr96o0-@m&ma^K3bj%=ZvdfvEQqcroOND7Akf(Y=FV`Yls=Prt1GjJZ?@&Q_iAOyv^ zTPo-h5rn#i;yoS=O6DLG83qV-&kPXCQ5YbEg^4-{<%SOs>dF})guRF&gmB^^f=~`A zx}~60k%JKKH$)K1As>u$&MQ@3NR|ascbB5IZU%pExz4zFlFPt9Lp@Hzut zEBqS_-eB++1MZK11%WoR@hI-Nam2STVjTakG1#H>zHq@MsD6jXYRvL5@K}M7gpmI( zR^;{aYus@@J+;ieqj3)nsml~pG2Ii!FhXG?DVQS zr)-k&ET0(!==s4YJtsJEh~@Mr-Yz7TKeJ#}%Zbd}Tl49%+dF28ov&V3ukrD1sjXn_ zw;OoVxYtSFxrlAjZD7DiQ@dMuP;23(1~~06QP;WU1`!MJ8-p5N%=^3$NUTNW$2a$! zf1y!Q{5+tTy788sA*tE^6{jra!%crLY~?RKSJQ6fIQqw&J)R@M3zuUO?Em1A2Y5h6 z|M`nPJv2SqrNG`{6~3M7(Jln^=r3l#p_Cn63K-!dk|dwxd?=%ZL{uVGG9vP11a^zd zf!*RFxMstFuWLFh=x0g=W%11Ak9NE@$D}Ch6~=fg)rHHSN6gs?;vE`Thx_}&x0V#~ z3T1(OXGj9Q|EI93ZQ`v1uyocq_7-b)uFog9L^<&1?oZg(-{OvfB;G<+8%hC*J|$p# zv!NWL$aQov(yM;!ZN7APN59%}8T`S;5e{_*Ak6^(9~j8BAW8ar zCW+ufNs?0IPZExAjXufYRW5A^5#!B4mPSfLp1bNC5)6e-bq}Ye*bA3-QpOzTM`WAy#273$+7?4H$O$4HUx`p-oEq{<%Jgi!>)4^@f x2X2gvNm-2IuV==8(HkHY@U}C$-zj4{mbAoo#ZUdisjB~S*_)_L{OiQm{}-79!Dj#f literal 0 HcmV?d00001 diff --git a/resources/scrapers/net.pyo b/resources/scrapers/net.pyo new file mode 100644 index 0000000000000000000000000000000000000000..d767edcf097b456aa49b111274207045c933a8f5 GIT binary patch literal 10756 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 import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('http://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2014 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. + +""" + +__title__ = 'requests' +__version__ = '2.5.0' +__build__ = 0x020500 +__author__ = 'Kenneth Reitz' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2014 Kenneth Reitz' + +# Attempt to enable urllib3's SNI support, if possible +try: + from .packages.urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() +except ImportError: + pass + +from . import utils +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) diff --git a/resources/scrapers/requests/__init__.pyc b/resources/scrapers/requests/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8954aacf51b66ef647fa5f20a00eaa57242ead41 GIT binary patch literal 2671 zcmc&#TXWM!6h6w0AaYL#w?G$jv7tdEY5U@VOd$=0Leq?5rmgB3p-79pK`W`dD}vk7 z=?wkH?L*(%b5^ngGktF5(Xq~DcfWJp@jqtWM}Pg&iJ^Wb@&9vt^=}S90uUf|AaEcV zgJ2AjaR|mCnSfvdl1T_AA(?_;3ImF^6riy)UESOU2W!7|7d z2v$Izh2Sj6RR~r=o`c{V$ny}K2YCU43)RXQNH2oC1i>YcYY?ne(pg9^gS-O4m5QH( z^dpcA0tWIb1Xn>eAZUQR2EjFu*CDtL@&*Jq(0U${1xRl~a1#bAKI|(4euN{`WSeVl=$u75eKam%EX^z0IuRc zmRuXn9(OwXEER_;QUmwbe|ucl9~ukIqU?hu>+DzwV|d0y#`XuMpJ(grWv*DilxTX$ zMb^_Edl+dEvoCi$ZmFXlZ@VsIY<-hMvlqhz zdQl->c+1)$XwIwKXM4E6DiB#j> zW*V!1c%Y`iwB>!~Z3vhg13ioE2Zv}EB`3S~_^BPj-Xfe3Y4 ziRiS_Adc2JS)4-RS50M6`CJz{`eWu%v9EZ6F-~fO7QwbFYV3x#z@9J@_}}MIVn3*M z3>{NMChl9CqBLd-B?(Wt;dYC>pj_w{j(}=U&9z2}RUTB|Cy1$)bc?ny3rK1}yKiD{ zx3P;lLh>9BI)et!{byt&5WHQ`$@8zHY~b?*MX}K~GBj{@mBQ*FXLoW;Y)qi6O#F?{ zUWI^m+`~G09A!z$m46QT7+?EPpdaF^7m;whS8x^r%|g6X`~$l|Oit2EwmbN03K&{d z>b(|nP(^|inx`*qxDaZtl1fV^S|HhJcb{vnboW7mlcW2fD89fh?fQ8{gQWX3PeeCL z5{zxPNXs5J^lOpu+%vgS*aBR271w#GVy?S7R#8EF)d|(zFcg_EVMvpWuy85NS9CPN z2d63;s)I1hBFV$hP<4i(%#$)j*1w4C31a*8-@>-pd4eb`GBBrju zKVb;4EtfESjZwhVkFwg;Jr&r`_yFCcRp+}?NfdGOGL;6 zpKfsfERj_tHo$4#!+Pu43|K+kFgD^iC!V1m+vgJ56FMx@+Twq$7#o#)RRwR~MqJuM mGBq~kjDF+e&Vn=N%sLZe3(lI;c2<%1re>URX9cB~C;kBp^rvM2 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/__init__.pyo b/resources/scrapers/requests/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..8954aacf51b66ef647fa5f20a00eaa57242ead41 GIT binary patch literal 2671 zcmc&#TXWM!6h6w0AaYL#w?G$jv7tdEY5U@VOd$=0Leq?5rmgB3p-79pK`W`dD}vk7 z=?wkH?L*(%b5^ngGktF5(Xq~DcfWJp@jqtWM}Pg&iJ^Wb@&9vt^=}S90uUf|AaEcV zgJ2AjaR|mCnSfvdl1T_AA(?_;3ImF^6riy)UESOU2W!7|7d z2v$Izh2Sj6RR~r=o`c{V$ny}K2YCU43)RXQNH2oC1i>YcYY?ne(pg9^gS-O4m5QH( z^dpcA0tWIb1Xn>eAZUQR2EjFu*CDtL@&*Jq(0U${1xRl~a1#bAKI|(4euN{`WSeVl=$u75eKam%EX^z0IuRc zmRuXn9(OwXEER_;QUmwbe|ucl9~ukIqU?hu>+DzwV|d0y#`XuMpJ(grWv*DilxTX$ zMb^_Edl+dEvoCi$ZmFXlZ@VsIY<-hMvlqhz zdQl->c+1)$XwIwKXM4E6DiB#j> zW*V!1c%Y`iwB>!~Z3vhg13ioE2Zv}EB`3S~_^BPj-Xfe3Y4 ziRiS_Adc2JS)4-RS50M6`CJz{`eWu%v9EZ6F-~fO7QwbFYV3x#z@9J@_}}MIVn3*M z3>{NMChl9CqBLd-B?(Wt;dYC>pj_w{j(}=U&9z2}RUTB|Cy1$)bc?ny3rK1}yKiD{ zx3P;lLh>9BI)et!{byt&5WHQ`$@8zHY~b?*MX}K~GBj{@mBQ*FXLoW;Y)qi6O#F?{ zUWI^m+`~G09A!z$m46QT7+?EPpdaF^7m;whS8x^r%|g6X`~$l|Oit2EwmbN03K&{d z>b(|nP(^|inx`*qxDaZtl1fV^S|HhJcb{vnboW7mlcW2fD89fh?fQ8{gQWX3PeeCL z5{zxPNXs5J^lOpu+%vgS*aBR271w#GVy?S7R#8EF)d|(zFcg_EVMvpWuy85NS9CPN z2d63;s)I1hBFV$hP<4i(%#$)j*1w4C31a*8-@>-pd4eb`GBBrju zKVb;4EtfESjZwhVkFwg;Jr&r`_yFCcRp+}?NfdGOGL;6 zpKfsfERj_tHo$4#!+Pu43|K+kFgD^iC!V1m+vgJ56FMx@+Twq$7#o#)RRwR~MqJuM mGBq~kjDF+e&Vn=N%sLZe3(lI;c2<%1re>URX9cB~C;kBp^rvM2 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/adapters.py b/resources/scrapers/requests/adapters.py new file mode 100644 index 0000000..c892853 --- /dev/null +++ b/resources/scrapers/requests/adapters.py @@ -0,0 +1,437 @@ +# -*- coding: utf-8 -*- + +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import socket + +from .models import Response +from .packages.urllib3 import Retry +from .packages.urllib3.poolmanager import PoolManager, proxy_from_url +from .packages.urllib3.response import HTTPResponse +from .packages.urllib3.util import Timeout as TimeoutSauce +from .compat import urlparse, basestring +from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, + prepend_scheme_if_needed, get_auth_from_url, urldefragauth) +from .structures import CaseInsensitiveDict +from .packages.urllib3.exceptions import ConnectTimeoutError +from .packages.urllib3.exceptions import HTTPError as _HTTPError +from .packages.urllib3.exceptions import MaxRetryError +from .packages.urllib3.exceptions import ProxyError as _ProxyError +from .packages.urllib3.exceptions import ProtocolError +from .packages.urllib3.exceptions import ReadTimeoutError +from .packages.urllib3.exceptions import SSLError as _SSLError +from .packages.urllib3.exceptions import ResponseError +from .cookies import extract_cookies_to_jar +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError) +from .auth import _basic_auth_str + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 + + +class BaseAdapter(object): + """The Base Transport Adapter""" + + def __init__(self): + super(BaseAdapter, self).__init__() + + def send(self): + raise NotImplementedError + + def close(self): + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session ` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param int max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return dict((attr, getattr(self, attr, None)) for attr in + self.__attrs__) + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # because self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + """ + if not proxy in self.proxy_manager: + proxy_headers = self.proxy_headers(proxy) + self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return self.proxy_manager[proxy] + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Whether we should actually verify the certificate. + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = DEFAULT_CA_BUNDLE_PATH + + if not cert_loc: + raise Exception("Could not find a suitable SSL CA certificate bundle.") + + conn.cert_reqs = 'CERT_REQUIRED' + conn.ca_certs = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + + def build_response(self, req, resp): + """Builds a :class:`Response ` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter ` + + :param req: The :class:`PreparedRequest ` used to generate the response. + :param resp: The urllib3 response object. + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, 'status', None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode('utf-8') + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + """ + proxies = proxies or {} + proxy = proxies.get(urlparse(url.lower()).scheme) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this just closes the PoolManager, which closes pooled + connections. + """ + self.poolmanager.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` being sent. + :param proxies: A dictionary of schemes to proxy URLs. + """ + proxies = proxies or {} + scheme = urlparse(request.url).scheme + proxy = proxies.get(scheme) + + if proxy and scheme != 'https': + url = urldefragauth(request.url) + else: + url = request.path_url + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter `. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param proxies: The url of the proxy being used for this request. + :param kwargs: Optional additional keyword arguments. + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a (`connect timeout, read + timeout `_) tuple. + :type timeout: float or tuple + :param verify: (optional) Whether to verify SSL certificates. + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + + conn = self.get_connection(request.url, proxies) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {0}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=timeout) + + try: + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + r = low_conn.getresponse() + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + else: + # All is well, return the connection to the pool. + conn._put_conn(low_conn) + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/resources/scrapers/requests/adapters.pyc b/resources/scrapers/requests/adapters.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ffd369d874c32625f0d292a0b1f6ffd8016d855 GIT binary patch literal 16770 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 vClE(^z*K16FkedEq)1K3FB6ppczVV`. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': ('filename', fileobj)}``) for multipart encoding upload. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send data + before giving up, as a float, or a (`connect timeout, read timeout + `_) tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'http://httpbin.org/get') + + """ + + session = sessions.Session() + response = session.request(method=method, url=url, **kwargs) + # By explicitly closing the session, we avoid leaving sockets open which + # can trigger a ResourceWarning in some cases, and look like a memory leak + # in others. + session.close() + return response + + +def get(url, **kwargs): + """Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, **kwargs) + + +def options(url, **kwargs): + """Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + """Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + """Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + """Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + """Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + """Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return request('delete', url, **kwargs) diff --git a/resources/scrapers/requests/api.pyc b/resources/scrapers/requests/api.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0841c063dba283f4abeb37a35f0e8ac68a96089f GIT binary patch literal 6158 zcmds5-A)@v6doHAz>p^Wy=kS6)C=2@V^XAE)Jjnupd}3gv^F=XD?HvE+XL&J&CWQ~ zP12j@HqX$EHU&YAO_zuB3;uN2f@{ie^d&kVl5 z#$_Vh0>4SySL!R3vOIsLBY{G;zntSxMx)$7|DFZpG@a`W>Q-Wl<`GK!?_gIw94s)bspd>I*8 zoTsp zH1P#)ma&5z`-QQ`Gwjg}JIIqgAHk}5_6UPKd&=^UXWi5ck>wuEvPOwuFe`J6t%0#k zhCa3^q5zsj0Y<#$hr*azJKHk9l?_(g)dI)IlXjRyW{S?l;3SDK9j&&x?i@(pVnei| z7K=m-_yCsCK`r}syC>5|@@R^e1Lt`C)be2x*7%;c^}-9CbOWGtY++0hmifB!-7pz( zV9*&^379qSNV0JF=46yLH}{=LP8;RFu_l|IWlVSz$X(uU7b7u{#oDp;Z=_yo+HLqo0*Z%Yl2Vb_ zIr@sD2W9zjyIoFWb{JX(ud-Z5z7EJchH_~+nWhS>s zL3>{3YxVuxd)w<<8$1?pDqlp{n{f#Y(jKT_vdJ{{B8N#aI4kfQteQwnvh>Y?y`?lb zmaGN?m{V98j(DJtB69Up0!Y)->>Dm|R#FvV7Gpy0hl)76jZuj4QZ<%?a+Tld@+O5w zg_nvnTdeTnp&S*b4(hBTF>$sJMGn&mFhJBa!rsqtA-HEBs?DN}yxzX3#OQwOVTr5ocQU zV4$K_J&xBA*)2~C{Oq;vA{n(r5TG2l;&9l*zQ`AJ)#@aH-DT1OV?9iKXUOacJwYTLmdeFbSd}oY$4~9+N3qjx(LgR76i?Qn|PWZ zHygi!vXONcu>Kg6>N8u3=-U;YF;^9)GD5+dm#yw?6xv#~G-b$MMVWzozc+0ra~+)i_f`j_g32V zqx<`T_V@Pz1`>(8xe`OoyGPxiNBxDXMB6%&9s%c3w0nfHM|_XZ7H;&)PK)ledMkZt bzUtnxQ#HJtzc#Z_T3DpNt4m9ZON;*i-D?a= literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/api.pyo b/resources/scrapers/requests/api.pyo new file mode 100644 index 0000000000000000000000000000000000000000..0841c063dba283f4abeb37a35f0e8ac68a96089f GIT binary patch literal 6158 zcmds5-A)@v6doHAz>p^Wy=kS6)C=2@V^XAE)Jjnupd}3gv^F=XD?HvE+XL&J&CWQ~ zP12j@HqX$EHU&YAO_zuB3;uN2f@{ie^d&kVl5 z#$_Vh0>4SySL!R3vOIsLBY{G;zntSxMx)$7|DFZpG@a`W>Q-Wl<`GK!?_gIw94s)bspd>I*8 zoTsp zH1P#)ma&5z`-QQ`Gwjg}JIIqgAHk}5_6UPKd&=^UXWi5ck>wuEvPOwuFe`J6t%0#k zhCa3^q5zsj0Y<#$hr*azJKHk9l?_(g)dI)IlXjRyW{S?l;3SDK9j&&x?i@(pVnei| z7K=m-_yCsCK`r}syC>5|@@R^e1Lt`C)be2x*7%;c^}-9CbOWGtY++0hmifB!-7pz( zV9*&^379qSNV0JF=46yLH}{=LP8;RFu_l|IWlVSz$X(uU7b7u{#oDp;Z=_yo+HLqo0*Z%Yl2Vb_ zIr@sD2W9zjyIoFWb{JX(ud-Z5z7EJchH_~+nWhS>s zL3>{3YxVuxd)w<<8$1?pDqlp{n{f#Y(jKT_vdJ{{B8N#aI4kfQteQwnvh>Y?y`?lb zmaGN?m{V98j(DJtB69Up0!Y)->>Dm|R#FvV7Gpy0hl)76jZuj4QZ<%?a+Tld@+O5w zg_nvnTdeTnp&S*b4(hBTF>$sJMGn&mFhJBa!rsqtA-HEBs?DN}yxzX3#OQwOVTr5ocQU zV4$K_J&xBA*)2~C{Oq;vA{n(r5TG2l;&9l*zQ`AJ)#@aH-DT1OV?9iKXUOacJwYTLmdeFbSd}oY$4~9+N3qjx(LgR76i?Qn|PWZ zHygi!vXONcu>Kg6>N8u3=-U;YF;^9)GD5+dm#yw?6xv#~G-b$MMVWzozc+0ra~+)i_f`j_g32V zqx<`T_V@Pz1`>(8xe`OoyGPxiNBxDXMB6%&9s%c3w0nfHM|_XZ7H;&)PK)ledMkZt bzUtnxQ#HJtzc#Z_T3DpNt4m9ZON;*i-D?a= literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/auth.py b/resources/scrapers/requests/auth.py new file mode 100644 index 0000000..618a902 --- /dev/null +++ b/resources/scrapers/requests/auth.py @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- + +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import os +import re +import time +import hashlib + +from base64 import b64encode + +from .compat import urlparse, str +from .cookies import extract_cookies_to_jar +from .utils import parse_dict_header, to_native_string +from .status_codes import codes + +CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' +CONTENT_TYPE_MULTI_PART = 'multipart/form-data' + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + authstr = 'Basic ' + to_native_string( + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip() + ) + + return authstr + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + def __init__(self, username, password): + self.username = username + self.password = password + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + def __init__(self, username, password): + self.username = username + self.password = password + self.last_nonce = '' + self.nonce_count = 0 + self.chal = {} + self.pos = None + + def build_digest_header(self, method, url): + + realm = self.chal['realm'] + nonce = self.chal['nonce'] + qop = self.chal.get('qop') + algorithm = self.chal.get('algorithm') + opaque = self.chal.get('opaque') + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + path = p_parsed.path + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self.last_nonce: + self.nonce_count += 1 + else: + self.nonce_count = 1 + ncvalue = '%08x' % self.nonce_count + s = str(self.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, HA2) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if qop is None: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + setattr(self, 'num_401_calls', 1) + + def handle_401(self, r, **kwargs): + """Takes the given response and tries digest-auth, if needed.""" + + if self.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self.pos) + num_401_calls = getattr(self, 'num_401_calls', 1) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and num_401_calls < 2: + + setattr(self, 'num_401_calls', num_401_calls + 1) + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.raw.release_conn() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + setattr(self, 'num_401_calls', num_401_calls + 1) + return r + + def __call__(self, r): + # If we have a saved nonce, skip the 401 + if self.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + return r diff --git a/resources/scrapers/requests/auth.pyc b/resources/scrapers/requests/auth.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bfbd5a8bfd5a6bf3cb827fe85cda9be80d9c6a43 GIT binary patch literal 8491 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/certs.pyo b/resources/scrapers/requests/certs.pyo new file mode 100644 index 0000000000000000000000000000000000000000..1d1b0a0bf6a849dce81f0783237779e2d20ab113 GIT binary patch literal 975 zcmc&z&5qMB5FRIKL1D{s{9E(=X#n)AOxzyfw0KkX!V<)sFiu^3Gy~)}rJRE73Qeua-Q-t4fu^BfsdiY%ojH zvx@Ic&xNHRQC^B#>6)+cV~@_e1;?z;7Q8Z+3;s&!{xg@#d8;mZuZ-q{y%k#2C{xr| z${O9G_KP8DDKsy)Lf1HeA}C6$LtMo_ZPDWVKKEusP8A$>!Vy-u=Z$ki_Y}6M3=kLiZ0}`;{@~L zqgjW_cWAo+8sZUFE0iW!0q+31D5NQiV$cmeHtK3U@EtrxT832q78%ak&RGAl;4!yoZzMiAX?5>s{(#q5;L*lcpbegWtd4Z#2a literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/compat.py b/resources/scrapers/requests/compat.py new file mode 100644 index 0000000..be5a1ed --- /dev/null +++ b/resources/scrapers/requests/compat.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- + +""" +pythoncompat +""" + +from .packages import chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +#: Python 3.0.x +is_py30 = (is_py3 and _ver[1] == 0) + +#: Python 3.1.x +is_py31 = (is_py3 and _ver[1] == 1) + +#: Python 3.2.x +is_py32 = (is_py3 and _ver[1] == 2) + +#: Python 3.3.x +is_py33 = (is_py3 and _ver[1] == 3) + +#: Python 3.4.x +is_py34 = (is_py3 and _ver[1] == 4) + +#: Python 2.7.x +is_py27 = (is_py2 and _ver[1] == 7) + +#: Python 2.6.x +is_py26 = (is_py2 and _ver[1] == 6) + +#: Python 2.5.x +is_py25 = (is_py2 and _ver[1] == 5) + +#: Python 2.4.x +is_py24 = (is_py2 and _ver[1] == 4) # I'm assuming this is not by choice. + + +# --------- +# Platforms +# --------- + + +# Syntax sugar. +_ver = sys.version.lower() + +is_pypy = ('pypy' in _ver) +is_jython = ('jython' in _ver) +is_ironpython = ('iron' in _ver) + +# Assume CPython, if nothing else. +is_cpython = not any((is_pypy, is_jython, is_ironpython)) + +# Windows-based system. +is_windows = 'win32' in str(sys.platform).lower() + +# Standard Linux 2+ system. +is_linux = ('linux' in str(sys.platform).lower()) +is_osx = ('darwin' in str(sys.platform).lower()) +is_hpux = ('hpux' in str(sys.platform).lower()) # Complete guess. +is_solaris = ('solar==' in str(sys.platform).lower()) # Complete guess. + +try: + import simplejson as json +except (ImportError, SyntaxError): + # simplejson does not support Python 3.2, it thows a SyntaxError + # because of u'...' Unicode literals. + import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, proxy_bypass + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + from .packages.urllib3.packages.ordered_dict import OrderedDict + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list, getproxies, proxy_bypass + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) diff --git a/resources/scrapers/requests/compat.pyc b/resources/scrapers/requests/compat.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee262bcfffbf64d7e0189315204b1a97b604a44a GIT binary patch literal 2558 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/cookies.pyo b/resources/scrapers/requests/cookies.pyo new file mode 100644 index 0000000000000000000000000000000000000000..00f39a8394ff46234b578ba0bdf38021583bb82f GIT binary patch literal 22819 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/exceptions.py b/resources/scrapers/requests/exceptions.py new file mode 100644 index 0000000..89135a8 --- /dev/null +++ b/resources/scrapers/requests/exceptions.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. + +""" +from .packages.urllib3.exceptions import HTTPError as BaseHTTPError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request.""" + + def __init__(self, *args, **kwargs): + """ + Initialize RequestException with `request` and `response` objects. + """ + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL schema (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """See defaults.py for valid schemas.""" + + +class InvalidURL(RequestException, ValueError): + """ The URL provided was somehow invalid. """ + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" diff --git a/resources/scrapers/requests/exceptions.pyc b/resources/scrapers/requests/exceptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cb39bd530188d347f6fce9060b5b0a1c43c866d GIT binary patch literal 6272 zcmdT|Uvm>T5SRbNAtoUtkU;oXL1}UO;LfxUonbnZ5MW9RfjJvy%6RH1C)vK_d~#1Z zf;%Y>rO*8keeDP82k95+Z*_m-!gT8N1>@vo-%48T{&uyyQsu9uy8iR9?X&Dt!S`)E z=Jyg~lCkG#OH7toSYpF6dtPBBSz)TmdZ1R>uZ+EB?EB|)OwKVi=cu)UT4r)Sr=BRN zH6|CBs=2ZCf;!LS$(*`aP){(qlyf*$P#2h7rm<>)^{~e2qNC2_ilaif)q;AG$ul{V zvjugL$+euiUQm~qJV#V@%CSCQbSyKuG0}0M=s3;f#fgqfMaK%0m-7X#6x3BFKXAh< zZUJ6&oMG~+>p1H=t`!|?On#X2xn5A$nf!>g8XuFb1e$uReoU0Hrm0@~YGeZ)nfj}@ zKlOTh5EwqxG6@y;b!0^l8EyxP8)dofaW7+ZgCB8f*6RTrf;FhI3uwM+x1ZdLV;$Sm zc+2M8%a<d z17Zru==(_=E6EQA0dyFMNQObw=VP73b&gL4MboF%t9Zz(iNC>;?6A!CQm?MC*Jbu| zg&pFbv2Hog&hz}`GN zED`tLnA<<#^n)m{fe3@2RBnL+O@0vA0pH2g+5tF{-pmL#Ry$np?kOLJ zFId?VV4U~cdH3R+W4l2;mf#ra5maDoTSv+x19(Jrg9pM0Yhx$?8IzHUJ!f^A+U*7q zv)gs@yZJ_iJ@-SzeFKFV+drV6j%Nd}%r#~ozqW36o*EUK&ZZm&QD<{Bx+|>ccv|4K z-}z3wI$L^B|ze&3n!*3sA_X;<)= zQ)pOqwX{%LE3KE7ORJ?+_*9)p3{|&l>loARrket<1X;H$wcqVJMn`(Q8)XRpB|L^K zRx8)a9=_Szn~Zdw++^5WG}Uds&4|;U<%%|Kv4@%sGP}1(4Xxl2i+8OqL||9&81lmGicz29$xTh6ryUHHPVDqP{s&D$2G3$4w_qSSSRijx zZrKvnA5e<4l>5^Na1ewc_o;*LYCCY_ZX$->+O8$Ue)%_ZWEG2z$Icj<>Mx3F+-g^W#cHT66=LxV6=$~d zviz3TKG@4L@nPHvOA6FXM)VYMi4~ZqmB1{bd8j zKonCp`3n@3l7j)qzNc+XOvq1$VqbBQ2aK77VhtMHnSg?_LtE=dFt4X16hX~9Js#wF zm<`3@9RMMnKa+}60=qwpM;vt^ zeVb3nJBH~BGl>Y*G2gy{$b-l^_i+)q1~x6FxKurngg7;g#=Hk0(w&lGWM&eC^N@Ud z0t6}wGZ0|j>3!k`=JDJqkWc80g|jpc-9``9Kp!A(Iy9Pm7E{Ou#HZs=9w8}WZVi%X zU&(usk0WH%KW4%BH8@P>66J?TsgnCCSFSR)d^d3!#?tLXhEY0bCjI3C)Oz+NP`K~G zN&2q(UqD?2xBCKjE-r;gVnQ`%dJp05lE8ZwedZzr$4zG8Gn5QkHdbPY63-+kmXGN& zpMwFp4C*(+(?t+hkrimTORNw}$T5v_i_9W4bUglH0vd`c9u<+tM1&yTN{rP*c!Z4u zWq7FjfzNx+VP;YF%Mf|@NcHUor5SetVo95k@b^VunPw7)VX*tf#A(P~zgWu4cZ5+# zSD|!xd+^vH=kClrI>>wOf|SmA9vw0~az2lumPZwiN7>%pKRpv+qSCoe5Q_Jni*~e= zJrc>?ytc=qY#72zg%WxbmHEo{uEzc#A$x9-}% E0UPN~7XSbN literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/exceptions.pyo b/resources/scrapers/requests/exceptions.pyo new file mode 100644 index 0000000000000000000000000000000000000000..2cb39bd530188d347f6fce9060b5b0a1c43c866d GIT binary patch literal 6272 zcmdT|Uvm>T5SRbNAtoUtkU;oXL1}UO;LfxUonbnZ5MW9RfjJvy%6RH1C)vK_d~#1Z zf;%Y>rO*8keeDP82k95+Z*_m-!gT8N1>@vo-%48T{&uyyQsu9uy8iR9?X&Dt!S`)E z=Jyg~lCkG#OH7toSYpF6dtPBBSz)TmdZ1R>uZ+EB?EB|)OwKVi=cu)UT4r)Sr=BRN zH6|CBs=2ZCf;!LS$(*`aP){(qlyf*$P#2h7rm<>)^{~e2qNC2_ilaif)q;AG$ul{V zvjugL$+euiUQm~qJV#V@%CSCQbSyKuG0}0M=s3;f#fgqfMaK%0m-7X#6x3BFKXAh< zZUJ6&oMG~+>p1H=t`!|?On#X2xn5A$nf!>g8XuFb1e$uReoU0Hrm0@~YGeZ)nfj}@ zKlOTh5EwqxG6@y;b!0^l8EyxP8)dofaW7+ZgCB8f*6RTrf;FhI3uwM+x1ZdLV;$Sm zc+2M8%a<d z17Zru==(_=E6EQA0dyFMNQObw=VP73b&gL4MboF%t9Zz(iNC>;?6A!CQm?MC*Jbu| zg&pFbv2Hog&hz}`GN zED`tLnA<<#^n)m{fe3@2RBnL+O@0vA0pH2g+5tF{-pmL#Ry$np?kOLJ zFId?VV4U~cdH3R+W4l2;mf#ra5maDoTSv+x19(Jrg9pM0Yhx$?8IzHUJ!f^A+U*7q zv)gs@yZJ_iJ@-SzeFKFV+drV6j%Nd}%r#~ozqW36o*EUK&ZZm&QD<{Bx+|>ccv|4K z-}z3wI$L^B|ze&3n!*3sA_X;<)= zQ)pOqwX{%LE3KE7ORJ?+_*9)p3{|&l>loARrket<1X;H$wcqVJMn`(Q8)XRpB|L^K zRx8)a9=_Szn~Zdw++^5WG}Uds&4|;U<%%|Kv4@%sGP}1(4Xxl2i+8OqL||9&81lmGicz29$xTh6ryUHHPVDqP{s&D$2G3$4w_qSSSRijx zZrKvnA5e<4l>5^Na1ewc_o;*LYCCY_ZX$->+O8$Ue)%_ZWEG2z$Icj<>Mx3F+-g^W#cHT66=LxV6=$~d zviz3TKG@4L@nPHvOA6FXM)VYMi4~ZqmB1{bd8j zKonCp`3n@3l7j)qzNc+XOvq1$VqbBQ2aK77VhtMHnSg?_LtE=dFt4X16hX~9Js#wF zm<`3@9RMMnKa+}60=qwpM;vt^ zeVb3nJBH~BGl>Y*G2gy{$b-l^_i+)q1~x6FxKurngg7;g#=Hk0(w&lGWM&eC^N@Ud z0t6}wGZ0|j>3!k`=JDJqkWc80g|jpc-9``9Kp!A(Iy9Pm7E{Ou#HZs=9w8}WZVi%X zU&(usk0WH%KW4%BH8@P>66J?TsgnCCSFSR)d^d3!#?tLXhEY0bCjI3C)Oz+NP`K~G zN&2q(UqD?2xBCKjE-r;gVnQ`%dJp05lE8ZwedZzr$4zG8Gn5QkHdbPY63-+kmXGN& zpMwFp4C*(+(?t+hkrimTORNw}$T5v_i_9W4bUglH0vd`c9u<+tM1&yTN{rP*c!Z4u zWq7FjfzNx+VP;YF%Mf|@NcHUor5SetVo95k@b^VunPw7)VX*tf#A(P~zgWu4cZ5+# zSD|!xd+^vH=kClrI>>wOf|SmA9vw0~az2lumPZwiN7>%pKRpv+qSCoe5Q_Jni*~e= zJrc>?ytc=qY#72zg%WxbmHEo{uEzc#A$x9-}% E0UPN~7XSbN literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/hooks.py b/resources/scrapers/requests/hooks.py new file mode 100644 index 0000000..5dfaf6b --- /dev/null +++ b/resources/scrapers/requests/hooks.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. + +""" + + +HOOKS = ['response'] + + +def default_hooks(): + hooks = {} + for event in HOOKS: + hooks[event] = [] + return hooks + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + + hooks = hooks or dict() + + if key in hooks: + hooks = hooks.get(key) + + if hasattr(hooks, '__call__'): + hooks = [hooks] + + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + + return hook_data diff --git a/resources/scrapers/requests/hooks.pyc b/resources/scrapers/requests/hooks.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0496c8c769611c20fb404b538d10cf33aeee7304 GIT binary patch literal 1211 zcmc&!!D<^Z5FPC%ZoR~D4n6cz(50~S;9GkLp)|yWLV^Q!N+4`lD=T@edc9gpa#DjG zDCxET(Q|*TKhPP~q4Wn@A&o|FMzfkX!^S^5$=&_;Q32b*aDRu(y+k1au23>48C)@t z5qw1?0vQJ-2Dt;HbeG(Jph&D*ES2-FH#KJFlKa0#l3Yx+<8vdImEw&xw^}O4{Z#Qn zG~z~A+G_+R#s+Y>4aP$-?pDsLc`r$hZ-uVJ4aNwD!z3Axt#Xa2of?l16OQ8ogFa%s zRJF3gE6FF;%(>v($Qa8%#b-Y{1`Z+wc5t2G3LI#F4Z!E;-~syA2e3gl0MpQYM&wwLAVKOCx_Wbr>x74UzomG9uEq?(9j zXUY<6Ic6J2BYhUQ&Z?^0*Y+F;K}-$bxDqj`z<&~KE|v)mgL zeeD|Iiz#-A2-W9O7haoM*cCT5f~7`+d81XKxS4Q?MD{|F^SlsMmFI($lJg|!uBX_g z^8N|#Q{ja7HW&w{Rw;22JZ5S&4ApFt8#Z@Nkv-XGcfyt~+#!Qc5DWYUm;YGmEmz?! zFYr;0>J4!>+GE|Q%l4uUL&*-JEhWT2o=a2Y`H48C)@t z5qw1?0vQJ-2Dt;HbeG(Jph&D*ES2-FH#KJFlKa0#l3Yx+<8vdImEw&xw^}O4{Z#Qn zG~z~A+G_+R#s+Y>4aP$-?pDsLc`r$hZ-uVJ4aNwD!z3Axt#Xa2of?l16OQ8ogFa%s zRJF3gE6FF;%(>v($Qa8%#b-Y{1`Z+wc5t2G3LI#F4Z!E;-~syA2e3gl0MpQYM&wwLAVKOCx_Wbr>x74UzomG9uEq?(9j zXUY<6Ic6J2BYhUQ&Z?^0*Y+F;K}-$bxDqj`z<&~KE|v)mgL zeeD|Iiz#-A2-W9O7haoM*cCT5f~7`+d81XKxS4Q?MD{|F^SlsMmFI($lJg|!uBX_g z^8N|#Q{ja7HW&w{Rw;22JZ5S&4ApFt8#Z@Nkv-XGcfyt~+#!Qc5DWYUm;YGmEmz?! zFYr;0>J4!>+GE|Q%l4uUL&*-JEhWT2o=a2Y`H` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. + :param json: json for the body to attach to the request (if data is not specified). + :param params: dictionary of URL parameters to append to the URL. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req.prepare() + + + """ + def __init__(self, + method=None, + url=None, + headers=None, + files=None, + data=None, + params=None, + auth=None, + cookies=None, + hooks=None, + json=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return '' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request ` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> r = req.prepare() + + + >>> s = requests.Session() + >>> s.send(r) + + + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + + def prepare(self, method=None, url=None, headers=None, files=None, + data=None, params=None, auth=None, cookies=None, hooks=None, + json=None): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return '' % (self.method) + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = self._cookies.copy() if self._cookies is not None else None + p.body = self.body + p.hooks = self.hooks + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = self.method.upper() + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindy call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/kennethreitz/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ':' in url and not url.lower().startswith('http'): + self.url = url + return + + # Support for unicode domain names and paths. + scheme, auth, host, port, path, query, fragment = parse_url(url) + + if not scheme: + raise MissingSchema("Invalid URL {0!r}: No schema supplied. " + "Perhaps you meant http://{0}?".format(url)) + + if not host: + raise InvalidURL("Invalid URL %r: No host supplied" % url) + + # Only want to apply IDNA to the hostname + try: + host = host.encode('idna').decode('utf-8') + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + + # Carefully reconstruct the network location + netloc = auth or '' + if netloc: + netloc += '@' + netloc += host + if port: + netloc += ':' + str(port) + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + if headers: + self.headers = CaseInsensitiveDict((to_native_string(name), value) for name, value in headers.items()) + else: + self.headers = CaseInsensitiveDict() + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + length = None + + if json is not None: + content_type = 'application/json' + body = json_dumps(json) + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, (basestring, list, tuple, dict)) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + if is_stream: + body = data + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length is not None: + self.headers['Content-Length'] = builtin_str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data and json is None: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ('content-type' not in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + if hasattr(body, 'seek') and hasattr(body, 'tell'): + body.seek(0, 2) + self.headers['Content-Length'] = builtin_str(body.tell()) + body.seek(0, 0) + elif body is not None: + l = super_len(body) + if l: + self.headers['Content-Length'] = builtin_str(l) + elif (self.method not in ('GET', 'HEAD')) and (self.headers.get('Content-Length') is None): + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data.""" + + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response ` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + '_content', + 'status_code', + 'headers', + 'url', + 'history', + 'encoding', + 'reason', + 'cookies', + 'elapsed', + 'request', + ] + + def __init__(self): + super(Response, self).__init__() + + self._content = False + self._content_consumed = False + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta) + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest ` object to which this + #: is a response. + self.request = None + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return dict( + (attr, getattr(self, attr, None)) + for attr in self.__attrs__ + ) + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '' % (self.status_code) + + def __bool__(self): + """Returns true if :attr:`status_code` is 'OK'.""" + return self.ok + + def __nonzero__(self): + """Returns true if :attr:`status_code` is 'OK'.""" + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + try: + self.raise_for_status() + except RequestException: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanant versions of redirect""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the chardet library""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + def generate(): + try: + # Special case for urllib3. + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + except AttributeError: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + try: + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0: + self._content = None + else: + self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() + + except AttributeError: + self._content = None + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + """Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + """ + + if not self.encoding and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return json.loads(self.content.decode(encoding), **kwargs) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return json.loads(self.text, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + + if 400 <= self.status_code < 500: + http_error_msg = '%s Client Error: %s' % (self.status_code, self.reason) + + elif 500 <= self.status_code < 600: + http_error_msg = '%s Server Error: %s' % (self.status_code, self.reason) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + return self.raw.release_conn() diff --git a/resources/scrapers/requests/models.pyc b/resources/scrapers/requests/models.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81438e6b32c32c4c08132581fa4100904fbae5e5 GIT binary patch literal 27338 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 E7nMi3KmY&$ literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/models.pyo b/resources/scrapers/requests/models.pyo new file mode 100644 index 0000000000000000000000000000000000000000..81438e6b32c32c4c08132581fa4100904fbae5e5 GIT binary patch literal 27338 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 E7nMi3KmY&$ literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/__init__.py b/resources/scrapers/requests/packages/__init__.py new file mode 100644 index 0000000..d62c4b7 --- /dev/null +++ b/resources/scrapers/requests/packages/__init__.py @@ -0,0 +1,3 @@ +from __future__ import absolute_import + +from . import urllib3 diff --git a/resources/scrapers/requests/packages/__init__.pyc b/resources/scrapers/requests/packages/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e847eed64a0dda6b2b19069da3899ac717ad9ebb GIT binary patch literal 317 zcmX|-!Ait15QZo1in1X35FUE!#hZxiqBp@q7cWa7WSg-B($i{3-3Wi9k$tlP$QL4R@1yhDIv1C$Qz(;P`d9BT_8f_DVI)nMW1$hV&Li1W&mw#& jm|0rv_-rSMjPZ+SWBT;YCvxre99;=`Q=gUVFP%5vw^vPr literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/__init__.pyo b/resources/scrapers/requests/packages/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..e847eed64a0dda6b2b19069da3899ac717ad9ebb GIT binary patch literal 317 zcmX|-!Ait15QZo1in1X35FUE!#hZxiqBp@q7cWa7WSg-B($i{3-3Wi9k$tlP$QL4R@1yhDIv1C$Qz(;P`d9BT_8f_DVI)nMW1$hV&Li1W&mw#& jm|0rv_-rSMjPZ+SWBT;YCvxre99;=`Q=gUVFP%5vw^vPr literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/chardet/__init__.py b/resources/scrapers/requests/packages/chardet/__init__.py new file mode 100644 index 0000000..82c2a48 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/__init__.py @@ -0,0 +1,32 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +__version__ = "2.3.0" +from sys import version_info + + +def detect(aBuf): + if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or + (version_info >= (3, 0) and not isinstance(aBuf, bytes))): + raise ValueError('Expected a bytes object, not a unicode object') + + from . import universaldetector + u = universaldetector.UniversalDetector() + u.reset() + u.feed(aBuf) + u.close() + return u.result diff --git a/resources/scrapers/requests/packages/chardet/__init__.pyc b/resources/scrapers/requests/packages/chardet/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..049b32a62524fa642dc4566ef815272bce9a8ab7 GIT binary patch literal 937 zcmd5)O>fgc5S_J~57HD02QK9hiHi>qAvho*gj(8iLFyq;4wWTq>)nJ+9Ix43R}D%p zgcE;|AHolSH%>w&egT%|d1q$l<2`NsYp-X2E8~T7N?YyyNX3DY6IT~;57=Ql*5YWF(Ga`3D zLC_MBh*lB#mrbfevlh8`+f>Y{KKna_HCBSY2`bS7Zi|W*&D(S%NGt_SJG3IYiD((o zw999~r#n0Xb&b>e8{P$zF4j3SyrF@Se+oFgu5=!>8py%rB4|Ibms13u3`!dit4otx zr8iN-4A(rPsoHU8&->E*|nq(v50@bi-`mANZgC| zMPKy99_%b(nqe1^W!q<%1!m_LzL9x!7tSrM|AJc=E4`juRTugV6Z6cXE%xI-N%7)t literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/chardet/__init__.pyo b/resources/scrapers/requests/packages/chardet/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..049b32a62524fa642dc4566ef815272bce9a8ab7 GIT binary patch literal 937 zcmd5)O>fgc5S_J~57HD02QK9hiHi>qAvho*gj(8iLFyq;4wWTq>)nJ+9Ix43R}D%p zgcE;|AHolSH%>w&egT%|d1q$l<2`NsYp-X2E8~T7N?YyyNX3DY6IT~;57=Ql*5YWF(Ga`3D zLC_MBh*lB#mrbfevlh8`+f>Y{KKna_HCBSY2`bS7Zi|W*&D(S%NGt_SJG3IYiD((o zw999~r#n0Xb&b>e8{P$zF4j3SyrF@Se+oFgu5=!>8py%rB4|Ibms13u3`!dit4otx zr8iN-4A(rPsoHU8&->E*|nq(v50@bi-`mANZgC| zMPKy99_%b(nqe1^W!q<%1!m_LzL9x!7tSrM|AJc=E4`juRTugV6Z6cXE%xI-N%7)t literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/chardet/big5freq.py b/resources/scrapers/requests/packages/chardet/big5freq.py new file mode 100644 index 0000000..65bffc0 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/big5freq.py @@ -0,0 +1,925 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +Big5CharToFreqOrder = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 +#Everything below is of no interest for detection purpose +2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 +2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 +5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 +5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 +5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 +5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 +5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 +5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 +5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 +5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 +5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 +5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 +5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 +5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 +6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 +6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 +6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 +6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 +6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 +6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 +6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 +6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 +6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 +6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 +6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 +6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 +6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 +6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 +6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 +6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 +6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 +6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 +6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 +6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 +6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 +6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 +6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 +6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 +6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 +6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 +6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 +6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 +6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 +6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 +6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 +6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 +6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 +6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 +6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 +6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 +6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 +6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 +6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 +6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 +6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 +3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 +6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 +6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 +3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 +6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 +6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 +6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 +6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 +6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 +6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 +6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 +4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 +6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 +6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 +3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 +6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 +6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 +6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 +6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 +6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 +6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 +6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 +6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 +6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 +6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 +6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 +7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 +7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 +7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 +7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 +7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 +7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 +7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 +7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 +7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 +7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 +7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 +7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 +7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 +7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 +7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 +7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 +7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 +7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 +7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 +7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 +7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 +7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 +7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 +7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 +7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 +7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 +7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 +7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 +7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 +7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 +7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 +7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 +7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 +7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 +7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 +7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 +7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 +7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 +7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 +7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 +7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 +7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 +7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 +7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 +7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 +7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 +7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 +3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 +7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 +7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 +7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 +7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 +4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 +7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 +7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 +7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 +7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 +7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 +7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 +7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 +7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 +7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 +7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 +7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 +8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 +8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 +8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 +8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 +8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 +8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 +8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 +8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 +8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 +8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 +8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 +8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 +8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 +8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 +8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 +8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 +8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 +8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 +8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 +8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 +8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 +8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 +8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 +8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 +8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 +8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 +8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 +8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 +8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 +8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 +8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 +8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 +8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 +8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 +8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 +8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 +8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 +8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 +8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 +8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 +8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 +8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 +8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 +8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 +8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 +8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 +8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 +8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 +8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 +8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 +8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 +8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 +8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 +8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 +8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 +8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 +8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 +8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 +8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 +4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 +8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 +8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 +8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 +8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 +9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 +9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 +9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 +9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 +9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 +9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 +9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 +9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 +9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 +9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 +9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 +9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 +9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 +9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 +9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 +9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 +9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 +9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 +9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 +9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 +9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 +9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 +9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 +9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 +9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 +9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 +9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 +9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 +9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 +9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 +9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 +9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 +9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 +9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 +9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 +9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 +9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 +9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 +3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 +9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 +9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 +9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 +4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 +9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 +9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 +9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 +9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 +9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 +9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 +9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 +9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 +9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 +9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 +9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 +9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 +9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 +9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 +9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 +9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 +9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 +9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 +9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 +9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 +9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 +9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 +9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 +10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 +10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 +10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 +10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 +10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 +10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 +10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 +10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 +10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 +4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 +10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 +10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 +10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 +10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 +10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 +10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 +10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 +10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 +4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 +10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 +10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 +10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 +10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 +10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 +10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 +10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 +10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 +10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 +10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 +10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 +10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 +10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 +10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 +10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 +10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 +10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 +4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 +10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 +10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 +10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 +10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 +10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 +10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 +10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 +10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 +10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 +10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 +10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 +10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 +10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 +10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 +10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 +10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 +10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 +10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 +10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 +10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 +10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 +10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 +10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 +10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 +10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 +10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 +10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 +10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 +10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 +10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 +11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 +11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 +11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 +4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 +11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 +11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 +11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 +11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 +11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 +11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 +11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 +11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 +11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 +11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 +11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 +11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 +11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 +11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 +11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 +11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 +11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 +11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 +11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 +11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 +11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 +11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 +11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 +11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 +11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 +11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 +11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 +11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 +11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 +11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 +11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 +11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 +4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 +11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 +11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 +11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 +11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 +11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 +11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 +11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 +11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 +11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 +11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 +11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 +11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 +11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 +11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 +11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 +11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 +11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 +11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 +11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 +11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 +11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 +11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 +11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 +11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 +11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 +11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 +11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 +11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 +12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 +12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 +12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 +12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 +12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 +12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 +12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 +12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 +12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 +12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 +12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 +12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 +12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 +12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 +12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 +4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 +4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 +4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 +12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 +12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 +12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 +12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 +12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 +12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 +12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 +12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 +12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 +12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 +12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 +12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 +12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 +12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 +12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 +12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 +12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 +12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 +12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 +12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 +12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 +12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 +12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 +12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 +12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 +12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 +12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 +12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 +12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 +12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 +12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 +12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 +12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 +12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 +12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 +12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 +12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 +12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 +12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 +12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 +12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 +12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 +12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 +12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 +12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 +12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 +12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 +4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 +13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 +13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 +13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 +13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 +13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 +13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 +13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 +4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 +13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 +13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 +13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 +13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 +13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 +13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 +13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 +13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 +13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 +13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 +13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 +13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 +13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 +13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 +13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 +5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 +13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 +13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 +13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 +13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 +13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 +13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 +13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 +13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 +13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 +13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 +13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 +13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 +13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 +13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 +13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 +13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 +13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 +13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 +13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 +13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 +13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 +13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 +13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 +13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 +13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 +13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 +13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 +13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 +13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 +13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 +13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 +13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 +13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 +13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 +13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 +13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 +13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 +13968,13969,13970,13971,13972) #13973 + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/big5prober.py b/resources/scrapers/requests/packages/chardet/big5prober.py new file mode 100644 index 0000000..becce81 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/big5prober.py @@ -0,0 +1,42 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import Big5SMModel + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(Big5SMModel) + self._mDistributionAnalyzer = Big5DistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "Big5" diff --git a/resources/scrapers/requests/packages/chardet/chardetect.py b/resources/scrapers/requests/packages/chardet/chardetect.py new file mode 100644 index 0000000..ffe892f --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/chardetect.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys +from io import open + +from chardet import __version__ +from chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + u.feed(line) + u.close() + result = u.result + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + ''' + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + ''' + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + conflict_handler='resolve') + parser.add_argument('input', + help='File whose encoding we would like to determine.', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/resources/scrapers/requests/packages/chardet/chardistribution.py b/resources/scrapers/requests/packages/chardet/chardistribution.py new file mode 100644 index 0000000..4e64a00 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/chardistribution.py @@ -0,0 +1,231 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) +from .compat import wrap_ord + +ENOUGH_DATA_THRESHOLD = 1024 +SURE_YES = 0.99 +SURE_NO = 0.01 +MINIMUM_DATA_THRESHOLD = 3 + + +class CharDistributionAnalysis: + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._mCharToFreqOrder = None + self._mTableSize = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self._mTypicalDistributionRatio = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._mDone = False + self._mTotalChars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._mFreqChars = 0 + + def feed(self, aBuf, aCharLen): + """feed a character with known length""" + if aCharLen == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(aBuf) + else: + order = -1 + if order >= 0: + self._mTotalChars += 1 + # order is valid + if order < self._mTableSize: + if 512 > self._mCharToFreqOrder[order]: + self._mFreqChars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD: + return SURE_NO + + if self._mTotalChars != self._mFreqChars: + r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) + * self._mTypicalDistributionRatio)) + if r < SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._mTotalChars > ENOUGH_DATA_THRESHOLD + + def get_order(self, aBuf): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCTWCharToFreqOrder + self._mTableSize = EUCTW_TABLE_SIZE + self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = wrap_ord(aBuf[0]) + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = EUCKRCharToFreqOrder + self._mTableSize = EUCKR_TABLE_SIZE + self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = wrap_ord(aBuf[0]) + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = GB2312CharToFreqOrder + self._mTableSize = GB2312_TABLE_SIZE + self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = Big5CharToFreqOrder + self._mTableSize = BIG5_TABLE_SIZE + self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + CharDistributionAnalysis.__init__(self) + self._mCharToFreqOrder = JISCharToFreqOrder + self._mTableSize = JIS_TABLE_SIZE + self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, aBuf): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = wrap_ord(aBuf[0]) + if char >= 0xA0: + return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 + else: + return -1 diff --git a/resources/scrapers/requests/packages/chardet/charsetgroupprober.py b/resources/scrapers/requests/packages/chardet/charsetgroupprober.py new file mode 100644 index 0000000..85e7a1c --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +import sys +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mActiveNum = 0 + self._mProbers = [] + self._mBestGuessProber = None + + def reset(self): + CharSetProber.reset(self) + self._mActiveNum = 0 + for prober in self._mProbers: + if prober: + prober.reset() + prober.active = True + self._mActiveNum += 1 + self._mBestGuessProber = None + + def get_charset_name(self): + if not self._mBestGuessProber: + self.get_confidence() + if not self._mBestGuessProber: + return None +# self._mBestGuessProber = self._mProbers[0] + return self._mBestGuessProber.get_charset_name() + + def feed(self, aBuf): + for prober in self._mProbers: + if not prober: + continue + if not prober.active: + continue + st = prober.feed(aBuf) + if not st: + continue + if st == constants.eFoundIt: + self._mBestGuessProber = prober + return self.get_state() + elif st == constants.eNotMe: + prober.active = False + self._mActiveNum -= 1 + if self._mActiveNum <= 0: + self._mState = constants.eNotMe + return self.get_state() + return self.get_state() + + def get_confidence(self): + st = self.get_state() + if st == constants.eFoundIt: + return 0.99 + elif st == constants.eNotMe: + return 0.01 + bestConf = 0.0 + self._mBestGuessProber = None + for prober in self._mProbers: + if not prober: + continue + if not prober.active: + if constants._debug: + sys.stderr.write(prober.get_charset_name() + + ' not active\n') + continue + cf = prober.get_confidence() + if constants._debug: + sys.stderr.write('%s confidence = %s\n' % + (prober.get_charset_name(), cf)) + if bestConf < cf: + bestConf = cf + self._mBestGuessProber = prober + if not self._mBestGuessProber: + return 0.0 + return bestConf +# else: +# self._mBestGuessProber = self._mProbers[0] +# return self._mBestGuessProber.get_confidence() diff --git a/resources/scrapers/requests/packages/chardet/charsetprober.py b/resources/scrapers/requests/packages/chardet/charsetprober.py new file mode 100644 index 0000000..9758171 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/charsetprober.py @@ -0,0 +1,62 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +import re + + +class CharSetProber: + def __init__(self): + pass + + def reset(self): + self._mState = constants.eDetecting + + def get_charset_name(self): + return None + + def feed(self, aBuf): + pass + + def get_state(self): + return self._mState + + def get_confidence(self): + return 0.0 + + def filter_high_bit_only(self, aBuf): + aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf) + return aBuf + + def filter_without_english_letters(self, aBuf): + aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf) + return aBuf + + def filter_with_english_letters(self, aBuf): + # TODO + return aBuf diff --git a/resources/scrapers/requests/packages/chardet/codingstatemachine.py b/resources/scrapers/requests/packages/chardet/codingstatemachine.py new file mode 100644 index 0000000..8dd8c91 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/codingstatemachine.py @@ -0,0 +1,61 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart +from .compat import wrap_ord + + +class CodingStateMachine: + def __init__(self, sm): + self._mModel = sm + self._mCurrentBytePos = 0 + self._mCurrentCharLen = 0 + self.reset() + + def reset(self): + self._mCurrentState = eStart + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + # PY3K: aBuf is a byte stream, so c is an int, not a byte + byteCls = self._mModel['classTable'][wrap_ord(c)] + if self._mCurrentState == eStart: + self._mCurrentBytePos = 0 + self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] + # from byte's class and stateTable, we get its next state + curr_state = (self._mCurrentState * self._mModel['classFactor'] + + byteCls) + self._mCurrentState = self._mModel['stateTable'][curr_state] + self._mCurrentBytePos += 1 + return self._mCurrentState + + def get_current_charlen(self): + return self._mCurrentCharLen + + def get_coding_state_machine(self): + return self._mModel['name'] diff --git a/resources/scrapers/requests/packages/chardet/compat.py b/resources/scrapers/requests/packages/chardet/compat.py new file mode 100644 index 0000000..d9e30ad --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Ian Cordasco - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + base_str = (str, unicode) +else: + base_str = (bytes, str) + + +def wrap_ord(a): + if sys.version_info < (3, 0) and isinstance(a, base_str): + return ord(a) + else: + return a diff --git a/resources/scrapers/requests/packages/chardet/constants.py b/resources/scrapers/requests/packages/chardet/constants.py new file mode 100644 index 0000000..e4d148b --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/constants.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +_debug = 0 + +eDetecting = 0 +eFoundIt = 1 +eNotMe = 2 + +eStart = 0 +eError = 1 +eItsMe = 2 + +SHORTCUT_THRESHOLD = 0.95 diff --git a/resources/scrapers/requests/packages/chardet/cp949prober.py b/resources/scrapers/requests/packages/chardet/cp949prober.py new file mode 100644 index 0000000..ff4272f --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/cp949prober.py @@ -0,0 +1,44 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import CP949SMModel + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(CP949SMModel) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "CP949" diff --git a/resources/scrapers/requests/packages/chardet/escprober.py b/resources/scrapers/requests/packages/chardet/escprober.py new file mode 100644 index 0000000..80a844f --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/escprober.py @@ -0,0 +1,86 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, + ISO2022KRSMModel) +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .compat import wrap_ord + + +class EscCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = [ + CodingStateMachine(HZSMModel), + CodingStateMachine(ISO2022CNSMModel), + CodingStateMachine(ISO2022JPSMModel), + CodingStateMachine(ISO2022KRSMModel) + ] + self.reset() + + def reset(self): + CharSetProber.reset(self) + for codingSM in self._mCodingSM: + if not codingSM: + continue + codingSM.active = True + codingSM.reset() + self._mActiveSM = len(self._mCodingSM) + self._mDetectedCharset = None + + def get_charset_name(self): + return self._mDetectedCharset + + def get_confidence(self): + if self._mDetectedCharset: + return 0.99 + else: + return 0.00 + + def feed(self, aBuf): + for c in aBuf: + # PY3K: aBuf is a byte array, so c is an int, not a byte + for codingSM in self._mCodingSM: + if not codingSM: + continue + if not codingSM.active: + continue + codingState = codingSM.next_state(wrap_ord(c)) + if codingState == constants.eError: + codingSM.active = False + self._mActiveSM -= 1 + if self._mActiveSM <= 0: + self._mState = constants.eNotMe + return self.get_state() + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + self._mDetectedCharset = codingSM.get_coding_state_machine() # nopep8 + return self.get_state() + + return self.get_state() diff --git a/resources/scrapers/requests/packages/chardet/escsm.py b/resources/scrapers/requests/packages/chardet/escsm.py new file mode 100644 index 0000000..bd302b4 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/escsm.py @@ -0,0 +1,242 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart, eError, eItsMe + +HZ_cls = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_st = ( +eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 + 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f + 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 + 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f +) + +HZCharLenTable = (0, 0, 0, 0, 0, 0) + +HZSMModel = {'classTable': HZ_cls, + 'classFactor': 6, + 'stateTable': HZ_st, + 'charLenTable': HZCharLenTable, + 'name': "HZ-GB-2312"} + +ISO2022CN_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_st = ( +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 + 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 +eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f +) + +ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CNSMModel = {'classTable': ISO2022CN_cls, + 'classFactor': 9, + 'stateTable': ISO2022CN_st, + 'charLenTable': ISO2022CNCharLenTable, + 'name': "ISO-2022-CN"} + +ISO2022JP_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_st = ( +eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 +eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 +eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f +eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 +eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f +eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 +eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f +eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 +) + +ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JPSMModel = {'classTable': ISO2022JP_cls, + 'classFactor': 10, + 'stateTable': ISO2022JP_st, + 'charLenTable': ISO2022JPCharLenTable, + 'name': "ISO-2022-JP"} + +ISO2022KR_cls = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_st = ( +eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 +eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f +eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 +eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f +eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 +) + +ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) + +ISO2022KRSMModel = {'classTable': ISO2022KR_cls, + 'classFactor': 6, + 'stateTable': ISO2022KR_st, + 'charLenTable': ISO2022KRCharLenTable, + 'name': "ISO-2022-KR"} + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/eucjpprober.py b/resources/scrapers/requests/packages/chardet/eucjpprober.py new file mode 100644 index 0000000..8e64fdc --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/eucjpprober.py @@ -0,0 +1,90 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJPSMModel + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCJPSMModel) + self._mDistributionAnalyzer = EUCJPDistributionAnalysis() + self._mContextAnalyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return "EUC-JP" + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar, charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mContextAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/resources/scrapers/requests/packages/chardet/euckrfreq.py b/resources/scrapers/requests/packages/chardet/euckrfreq.py new file mode 100644 index 0000000..a179e4c --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/euckrfreq.py @@ -0,0 +1,596 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKRCharToFreqOrder = ( \ + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +#Everything below is of no interest for detection purpose +2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, +2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, +2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, +2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, +2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, +2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, +2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, +2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, +2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, +2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, +2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, +2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, +2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, +2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, +1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, +2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, +2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, +2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, +2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, +2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, +2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, +2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, +2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, +2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, +3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, +3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, +3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, +3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, +3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, +3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, +3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, +3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, +3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, +3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, +3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, +3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, +3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, +3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, +3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, +3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, +3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, +3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, +3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, +3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, +3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, +3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, +3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, +3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, +3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, +3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, +3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, +3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, +3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, +3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, +3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, +3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, +1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, +1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, +3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, +3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, +3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, +3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, +3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, +3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, +3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, +3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, +3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, +3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, +3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, +3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, +3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, +1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, +3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, +3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, +3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, +3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, +3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, +3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, +3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, +1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, +3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, +3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, +3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, +3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, +1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, +3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, +3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, +3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, +3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, +3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, +3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, +3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, +4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, +4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, +1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, +4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, +4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, +4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, +4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, +4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, +4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, +4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, +4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, +4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, +4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, +4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, +4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, +4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, +4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, +4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, +4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, +4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, +4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, +4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, +4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, +4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, +4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, +4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, +4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, +4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, +4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, +4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, +4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, +4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, +4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, +4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, +4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, +4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, +4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, +4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, +4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, +4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, +4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, +4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, +4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, +4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, +4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, +1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, +4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, +4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, +4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, +4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, +4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, +4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, +4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, +4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, +4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, +4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, +4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, +4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, +4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, +4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, +4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, +4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, +4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, +4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, +4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, +4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, +5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, +5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, +1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, +5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, +5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, +5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, +5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, +5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, +1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, +5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, +5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, +5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, +5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, +5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, +1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, +5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, +5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, +5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, +5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, +5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, +5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, +5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, +5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, +5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, +5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, +5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, +5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, +5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, +5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, +5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, +5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, +5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, +5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, +5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, +5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, +5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, +5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, +5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, +1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, +5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, +5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, +5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, +5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, +1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, +5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, +5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, +5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, +5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, +5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, +1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, +5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, +1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, +5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, +5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, +5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, +5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, +5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, +5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, +5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, +5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, +5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, +5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, +5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, +5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, +5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, +5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, +6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, +6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, +6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, +6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, +6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, +6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, +6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, +6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, +6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, +6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, +6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, +6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, +6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, +6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, +6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, +6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, +6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 +6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, +6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, +6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, +6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, +6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, +6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, +6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, +6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, +6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, +6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, +6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, +6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, +6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, +6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, +6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, +6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, +6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, +6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, +1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, +6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, +6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, +6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, +6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, +6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, +1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, +6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, +1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, +6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, +6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, +6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, +1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, +6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, +6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, +6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, +6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, +6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, +6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, +6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, +6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, +6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, +6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, +6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, +6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, +6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, +6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, +6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, +6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, +6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, +7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, +7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, +7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, +7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, +7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, +7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, +7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, +7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, +7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, +7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, +7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, +7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, +7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, +7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, +7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, +7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, +7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, +7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, +7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, +7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, +7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, +7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, +7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, +7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, +7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, +7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, +7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, +7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, +7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, +7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, +7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, +7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, +7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, +7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, +7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, +7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, +7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, +7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, +7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, +7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, +7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, +7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, +7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, +7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, +7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, +7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, +7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, +7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, +7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, +7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, +7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, +7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, +7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, +7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, +7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, +7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, +7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, +7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, +8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, +8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, +8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, +8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, +8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, +8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, +8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, +8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, +8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, +8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, +8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, +8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, +8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, +8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, +8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, +8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, +8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, +8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, +8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, +8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, +8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, +8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, +8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, +8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, +8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, +8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, +8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, +8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, +8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, +8736,8737,8738,8739,8740,8741) + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/euckrprober.py b/resources/scrapers/requests/packages/chardet/euckrprober.py new file mode 100644 index 0000000..5982a46 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/euckrprober.py @@ -0,0 +1,42 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKRSMModel + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCKRSMModel) + self._mDistributionAnalyzer = EUCKRDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-KR" diff --git a/resources/scrapers/requests/packages/chardet/euctwfreq.py b/resources/scrapers/requests/packages/chardet/euctwfreq.py new file mode 100644 index 0000000..576e750 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/euctwfreq.py @@ -0,0 +1,428 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 8102 + +EUCTWCharToFreqOrder = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +#Everything below is of no interest for detection purpose +2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 +2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 +8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 +8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 +8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 +8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 +8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 +8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 +8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 +8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 +8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 +8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 +8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 +8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 +8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 +8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 +8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 +8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 +8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 +8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 +8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 +8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 +8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 +8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 +8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 +8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 +8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 +8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 +8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 +8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 +8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 +8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 +8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 +8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 +8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 +8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 +8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 +8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 +8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 +8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/euctwprober.py b/resources/scrapers/requests/packages/chardet/euctwprober.py new file mode 100644 index 0000000..fe652fe --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/euctwprober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTWSMModel + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(EUCTWSMModel) + self._mDistributionAnalyzer = EUCTWDistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "EUC-TW" diff --git a/resources/scrapers/requests/packages/chardet/gb2312freq.py b/resources/scrapers/requests/packages/chardet/gb2312freq.py new file mode 100644 index 0000000..1238f51 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/gb2312freq.py @@ -0,0 +1,472 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312CharToFreqOrder = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 +#Everything below is of no interest for detection purpose +5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, +5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, +5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, +3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, +4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, +5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, +5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, +4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, +4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, +4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, +4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, +3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, +6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, +4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, +6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, +4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, +4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, +4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, +5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, +3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, +4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, +3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, +4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, +4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, +6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, +6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, +5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, +4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, +6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, +4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, +5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, +5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, +5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, +6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, +3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, +6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, +4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, +5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, +6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, +6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, +4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, +5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, +4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, +5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, +5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, +4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, +4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, +5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, +4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, +4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, +5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, +4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, +4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, +4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, +5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, +5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, +4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, +3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, +4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, +6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, +5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, +5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, +4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, +6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, +5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, +6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, +4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, +5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, +5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, +3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, +5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, +6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, +4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, +6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, +4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, +4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, +6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, +3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, +6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, +4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, +3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, +3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, +3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, +4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, +2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, +5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, +4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, +5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, +5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, +5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, +4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, +5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, +4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, +5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, +1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, +3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, +4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, +4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, +6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, +4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, +5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, +3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, +5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, +5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, +5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, +3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, +5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, +5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, +3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, +5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, +5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, +5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, +6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, +4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, +6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, +4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, +3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, +4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, +5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, +5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, +5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, +3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, +3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, +6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, +6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, +5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, +6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, +6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, +6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, +6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, +6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, +5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, +6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, +6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, +3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, +3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, +4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, +4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, +3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, +5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, +5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, +5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, +5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, +5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, +4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, +5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, +6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, +5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, +4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, +4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, +6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, +3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, +4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, +4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, +5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, +6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, +6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, +4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, +6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, +5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, +5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, +5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, +5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, +5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, +4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, +5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, +5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, +5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, +5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, +6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, +4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, +5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, +4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, +4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, +6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, +4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, +6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, +3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, +5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, +6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, +6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, +6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, +5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, +6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, +6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, +3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, +5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, +4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/gb2312prober.py b/resources/scrapers/requests/packages/chardet/gb2312prober.py new file mode 100644 index 0000000..0325a2d --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/gb2312prober.py @@ -0,0 +1,41 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312SMModel + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(GB2312SMModel) + self._mDistributionAnalyzer = GB2312DistributionAnalysis() + self.reset() + + def get_charset_name(self): + return "GB2312" diff --git a/resources/scrapers/requests/packages/chardet/hebrewprober.py b/resources/scrapers/requests/packages/chardet/hebrewprober.py new file mode 100644 index 0000000..ba225c5 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/hebrewprober.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .constants import eNotMe, eDetecting +from .compat import wrap_ord + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +# windows-1255 / ISO-8859-8 code points of interest +FINAL_KAF = 0xea +NORMAL_KAF = 0xeb +FINAL_MEM = 0xed +NORMAL_MEM = 0xee +FINAL_NUN = 0xef +NORMAL_NUN = 0xf0 +FINAL_PE = 0xf3 +NORMAL_PE = 0xf4 +FINAL_TSADI = 0xf5 +NORMAL_TSADI = 0xf6 + +# Minimum Visual vs Logical final letter score difference. +# If the difference is below this, don't rely solely on the final letter score +# distance. +MIN_FINAL_CHAR_DISTANCE = 5 + +# Minimum Visual vs Logical model score difference. +# If the difference is below this, don't rely at all on the model score +# distance. +MIN_MODEL_DISTANCE = 0.01 + +VISUAL_HEBREW_NAME = "ISO-8859-8" +LOGICAL_HEBREW_NAME = "windows-1255" + + +class HebrewProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mLogicalProber = None + self._mVisualProber = None + self.reset() + + def reset(self): + self._mFinalCharLogicalScore = 0 + self._mFinalCharVisualScore = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._mPrev = ' ' + self._mBeforePrev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._mLogicalProber = logicalProber + self._mVisualProber = visualProber + + def is_final(self, c): + return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, + FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] + + def feed(self, aBuf): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.get_state() == eNotMe: + # Both model probers say it's not them. No reason to continue. + return eNotMe + + aBuf = self.filter_high_bit_only(aBuf) + + for cur in aBuf: + if cur == ' ': + # We stand on a space - a word just ended + if self._mBeforePrev != ' ': + # next-to-last char was not a space so self._mPrev is not a + # 1 letter word + if self.is_final(self._mPrev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._mFinalCharLogicalScore += 1 + elif self.is_non_final(self._mPrev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._mFinalCharVisualScore += 1 + else: + # Not standing on a space + if ((self._mBeforePrev == ' ') and + (self.is_final(self._mPrev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._mFinalCharVisualScore += 1 + self._mBeforePrev = self._mPrev + self._mPrev = cur + + # Forever detecting, till the end or until both model probers return + # eNotMe (handled above) + return eDetecting + + def get_charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore + if finalsub >= MIN_FINAL_CHAR_DISTANCE: + return LOGICAL_HEBREW_NAME + if finalsub <= -MIN_FINAL_CHAR_DISTANCE: + return VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._mLogicalProber.get_confidence() + - self._mVisualProber.get_confidence()) + if modelsub > MIN_MODEL_DISTANCE: + return LOGICAL_HEBREW_NAME + if modelsub < -MIN_MODEL_DISTANCE: + return VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return LOGICAL_HEBREW_NAME + + def get_state(self): + # Remain active as long as any of the model probers are active. + if (self._mLogicalProber.get_state() == eNotMe) and \ + (self._mVisualProber.get_state() == eNotMe): + return eNotMe + return eDetecting diff --git a/resources/scrapers/requests/packages/chardet/jisfreq.py b/resources/scrapers/requests/packages/chardet/jisfreq.py new file mode 100644 index 0000000..064345b --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/jisfreq.py @@ -0,0 +1,569 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JISCharToFreqOrder = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +#Everything below is of no interest for detection purpose +2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 +6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 +6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 +6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 +6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 +4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 +4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 +3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 +3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 +4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 +3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 +6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 +4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 +6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 +6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 +6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 +6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 +6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 +6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 +3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 +3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 +6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 +2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 +4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 +4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 +4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 +6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 +3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 +4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 +4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 +6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 +4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 +6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 +3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 +2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 +4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 +2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 +6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 +4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 +6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 +6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 +6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 +4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 +6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 +2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 +6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 +4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 +6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 +4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 +4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 +6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 +6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 +6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 +3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 +1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 +3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 +3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 +4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 +6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 +3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 +6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 +3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 +3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 +2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 +6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 +6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 +3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 +6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 +3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 +6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 +6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 +6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 +4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 +6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 +4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 +3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 +3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 +6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 +6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 +4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 +6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 +6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 +6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 +6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 +6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 +6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 +4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 +4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 +3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 +6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 +4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 +2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 +6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 +6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 +4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 +2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 +4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 +2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 +4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 +4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 +4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 +6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 +3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 +6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 +3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 +6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 +2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 +3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 +7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 +2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 +3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 +3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 +3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 +3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 +7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 +7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 +7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 +7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 +7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 +4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 +3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 +3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 +4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 +3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 +3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 +7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 +4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 +7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 +7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 +7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 +7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 +7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 +4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 +4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 +7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 +3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 +4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 +7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 +7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 +4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 +3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 +3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 +7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 +4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 +4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 +4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 +4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 +4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 +4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 +7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 +7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 +7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 +7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 +7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 +2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 +3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 +7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 +7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 +3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 +4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 +3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 +3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 +2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 +7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 +7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 +4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 +3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 +3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 +7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 +7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 +7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 +4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 +7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 +2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 +3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 +4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 +7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 +4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 +4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 +7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 +7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 +5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 +7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 +7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 +7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 +7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 +7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 +5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 +5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 +7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 +3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 +7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 +7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 +3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 +7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 +7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 +1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 +3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 +4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 +2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 +3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 +2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 +5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 +4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 +4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 +5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 +7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 +7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 +7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 +7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 +3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 +7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 +3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 +7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 +4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 +7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 +7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 +7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 +7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 +7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 +7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 +7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 +7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 +7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 +7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 +7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 +7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 +8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 +8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 +8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 +8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 +8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 +8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 +8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 +8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 +8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 +8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 +8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 +8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 +8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 +8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 +8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 +8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 +8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/jpcntx.py b/resources/scrapers/requests/packages/chardet/jpcntx.py new file mode 100644 index 0000000..59aeb6a --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/jpcntx.py @@ -0,0 +1,227 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .compat import wrap_ord + +NUM_OF_CATEGORY = 6 +DONT_KNOW = -1 +ENOUGH_REL_THRESHOLD = 100 +MAX_REL_THRESHOLD = 1000 +MINIMUM_DATA_THRESHOLD = 4 + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis: + def __init__(self): + self.reset() + + def reset(self): + self._mTotalRel = 0 # total sequence received + # category counters, each interger counts sequence in its category + self._mRelSample = [0] * NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._mNeedToSkipCharNum = 0 + self._mLastCharOrder = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._mDone = False + + def feed(self, aBuf, aLen): + if self._mDone: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._mNeedToSkipCharNum + while i < aLen: + order, charLen = self.get_order(aBuf[i:i + 2]) + i += charLen + if i > aLen: + self._mNeedToSkipCharNum = i - aLen + self._mLastCharOrder = -1 + else: + if (order != -1) and (self._mLastCharOrder != -1): + self._mTotalRel += 1 + if self._mTotalRel > MAX_REL_THRESHOLD: + self._mDone = True + break + self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 + self._mLastCharOrder = order + + def got_enough_data(self): + return self._mTotalRel > ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._mTotalRel > MINIMUM_DATA_THRESHOLD: + return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel + else: + return DONT_KNOW + + def get_order(self, aBuf): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + self.charset_name = "SHIFT_JIS" + + def get_charset_name(self): + return self.charset_name + + def get_order(self, aBuf): + if not aBuf: + return -1, 1 + # find out current char's byte length + first_char = wrap_ord(aBuf[0]) + if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): + charLen = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self.charset_name = "CP932" + else: + charLen = 1 + + # return its order if it is hiragana + if len(aBuf) > 1: + second_char = wrap_ord(aBuf[1]) + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, charLen + + return -1, charLen + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, aBuf): + if not aBuf: + return -1, 1 + # find out current char's byte length + first_char = wrap_ord(aBuf[0]) + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + charLen = 2 + elif first_char == 0x8F: + charLen = 3 + else: + charLen = 1 + + # return its order if it is hiragana + if len(aBuf) > 1: + second_char = wrap_ord(aBuf[1]) + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, charLen + + return -1, charLen + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/langbulgarianmodel.py b/resources/scrapers/requests/packages/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..e5788fc --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/langbulgarianmodel.py @@ -0,0 +1,229 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'charToOrderMap': Latin5_BulgarianCharToOrderMap, + 'precedenceMatrix': BulgarianLangModel, + 'mTypicalPositiveRatio': 0.969392, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-5" +} + +Win1251BulgarianModel = { + 'charToOrderMap': win1251BulgarianCharToOrderMap, + 'precedenceMatrix': BulgarianLangModel, + 'mTypicalPositiveRatio': 0.969392, + 'keepEnglishLetter': False, + 'charsetName': "windows-1251" +} + + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/langcyrillicmodel.py b/resources/scrapers/requests/packages/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..a86f54b --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/langcyrillicmodel.py @@ -0,0 +1,329 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'charToOrderMap': KOI8R_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "KOI8-R" +} + +Win1251CyrillicModel = { + 'charToOrderMap': win1251_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "windows-1251" +} + +Latin5CyrillicModel = { + 'charToOrderMap': latin5_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-5" +} + +MacCyrillicModel = { + 'charToOrderMap': macCyrillic_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "MacCyrillic" +}; + +Ibm866Model = { + 'charToOrderMap': IBM866_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "IBM866" +} + +Ibm855Model = { + 'charToOrderMap': IBM855_CharToOrderMap, + 'precedenceMatrix': RussianLangModel, + 'mTypicalPositiveRatio': 0.976601, + 'keepEnglishLetter': False, + 'charsetName': "IBM855" +} + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/langgreekmodel.py b/resources/scrapers/requests/packages/chardet/langgreekmodel.py new file mode 100644 index 0000000..ddb5837 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'charToOrderMap': Latin7_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': False, + 'charsetName': "ISO-8859-7" +} + +Win1253GreekModel = { + 'charToOrderMap': win1253_CharToOrderMap, + 'precedenceMatrix': GreekLangModel, + 'mTypicalPositiveRatio': 0.982851, + 'keepEnglishLetter': False, + 'charsetName': "windows-1253" +} + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/langhebrewmodel.py b/resources/scrapers/requests/packages/chardet/langhebrewmodel.py new file mode 100644 index 0000000..75f2bc7 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/langhebrewmodel.py @@ -0,0 +1,201 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +win1255_CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HebrewLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'charToOrderMap': win1255_CharToOrderMap, + 'precedenceMatrix': HebrewLangModel, + 'mTypicalPositiveRatio': 0.984004, + 'keepEnglishLetter': False, + 'charsetName': "windows-1255" +} + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/langhungarianmodel.py b/resources/scrapers/requests/packages/chardet/langhungarianmodel.py new file mode 100644 index 0000000..49d2f0f --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'charToOrderMap': Latin2_HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': True, + 'charsetName': "ISO-8859-2" +} + +Win1250HungarianModel = { + 'charToOrderMap': win1250HungarianCharToOrderMap, + 'precedenceMatrix': HungarianLangModel, + 'mTypicalPositiveRatio': 0.947368, + 'keepEnglishLetter': True, + 'charsetName': "windows-1250" +} + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/langthaimodel.py b/resources/scrapers/requests/packages/chardet/langthaimodel.py new file mode 100644 index 0000000..0508b1b --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/langthaimodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'charToOrderMap': TIS620CharToOrderMap, + 'precedenceMatrix': ThaiLangModel, + 'mTypicalPositiveRatio': 0.926386, + 'keepEnglishLetter': False, + 'charsetName': "TIS-620" +} + +# flake8: noqa diff --git a/resources/scrapers/requests/packages/chardet/latin1prober.py b/resources/scrapers/requests/packages/chardet/latin1prober.py new file mode 100644 index 0000000..eef3573 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/latin1prober.py @@ -0,0 +1,139 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .constants import eNotMe +from .compat import wrap_ord + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( + # UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self.reset() + + def reset(self): + self._mLastCharClass = OTH + self._mFreqCounter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + def get_charset_name(self): + return "windows-1252" + + def feed(self, aBuf): + aBuf = self.filter_with_english_letters(aBuf) + for c in aBuf: + charClass = Latin1_CharToClass[wrap_ord(c)] + freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) + + charClass] + if freq == 0: + self._mState = eNotMe + break + self._mFreqCounter[freq] += 1 + self._mLastCharClass = charClass + + return self.get_state() + + def get_confidence(self): + if self.get_state() == eNotMe: + return 0.01 + + total = sum(self._mFreqCounter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._mFreqCounter[3] - self._mFreqCounter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/resources/scrapers/requests/packages/chardet/mbcharsetprober.py b/resources/scrapers/requests/packages/chardet/mbcharsetprober.py new file mode 100644 index 0000000..bb42f2f --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/mbcharsetprober.py @@ -0,0 +1,86 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .charsetprober import CharSetProber + + +class MultiByteCharSetProber(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mDistributionAnalyzer = None + self._mCodingSM = None + self._mLastChar = [0, 0] + + def reset(self): + CharSetProber.reset(self) + if self._mCodingSM: + self._mCodingSM.reset() + if self._mDistributionAnalyzer: + self._mDistributionAnalyzer.reset() + self._mLastChar = [0, 0] + + def get_charset_name(self): + pass + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mDistributionAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + return self._mDistributionAnalyzer.get_confidence() diff --git a/resources/scrapers/requests/packages/chardet/mbcsgroupprober.py b/resources/scrapers/requests/packages/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..03c9dcf --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/resources/scrapers/requests/packages/chardet/mbcssm.py b/resources/scrapers/requests/packages/chardet/mbcssm.py new file mode 100644 index 0000000..efe678c --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .constants import eStart, eError, eItsMe + +# BIG5 + +BIG5_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_st = ( + eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 + eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f + eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17 +) + +Big5CharLenTable = (0, 1, 1, 2, 0) + +Big5SMModel = {'classTable': BIG5_cls, + 'classFactor': 5, + 'stateTable': BIG5_st, + 'charLenTable': Big5CharLenTable, + 'name': 'Big5'} + +# CP949 + +CP949_cls = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_st = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + eError,eStart, 3,eError,eStart,eStart, 4, 5,eError, 6, # eStart + eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe + eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3 + eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4 + eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5 + eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6 +) + +CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949SMModel = {'classTable': CP949_cls, + 'classFactor': 10, + 'stateTable': CP949_st, + 'charLenTable': CP949CharLenTable, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_cls = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_st = ( + 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 + eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f + 3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27 +) + +EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) + +EUCJPSMModel = {'classTable': EUCJP_cls, + 'classFactor': 6, + 'stateTable': EUCJP_st, + 'charLenTable': EUCJPCharLenTable, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_st = ( + eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 + eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f +) + +EUCKRCharLenTable = (0, 1, 2, 0) + +EUCKRSMModel = {'classTable': EUCKR_cls, + 'classFactor': 4, + 'stateTable': EUCKR_st, + 'charLenTable': EUCKRCharLenTable, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_cls = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_st = ( + eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 + eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 + eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f + 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 + eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f +) + +EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) + +EUCTWSMModel = {'classTable': EUCTW_cls, + 'classFactor': 7, + 'stateTable': EUCTW_st, + 'charLenTable': EUCTWCharLenTable, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_st = ( + eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 + eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 + 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f + eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 + eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validing +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) + +GB2312SMModel = {'classTable': GB2312_cls, + 'classFactor': 7, + 'stateTable': GB2312_st, + 'charLenTable': GB2312CharLenTable, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_st = ( + eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17 +) + +SJISCharLenTable = (0, 1, 1, 2, 0, 0) + +SJISSMModel = {'classTable': SJIS_cls, + 'classFactor': 6, + 'stateTable': SJIS_st, + 'charLenTable': SJISCharLenTable, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_cls = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_st = ( + 5, 7, 7,eError, 4, 3,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 + 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,eError,#20-27 + 5, 8, 6, 6,eError, 6, 6, 6,#28-2f + 6, 6, 6, 6,eError,eError,eStart,eStart #30-37 +) + +UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) + +UCS2BESMModel = {'classTable': UCS2BE_cls, + 'classFactor': 6, + 'stateTable': UCS2BE_st, + 'charLenTable': UCS2BECharLenTable, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_cls = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_st = ( + 6, 6, 7, 6, 4, 3,eError,eError,#00-07 + eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f + eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 + 5, 5, 5,eError, 5,eError, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,eError,#20-27 + 5, 5, 5,eError,eError,eError, 5, 5,#28-2f + 5, 5, 5,eError, 5,eError,eStart,eStart #30-37 +) + +UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) + +UCS2LESMModel = {'classTable': UCS2LE_cls, + 'classFactor': 6, + 'stateTable': UCS2LE_st, + 'charLenTable': UCS2LECharLenTable, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_cls = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_st = ( + eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + eError,eError,eError,eError,eError,eError,eError,eError,#10-17 + eError,eError,eError,eError,eError,eError,eError,eError,#18-1f + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 + eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f + eError,eError, 5, 5, 5, 5,eError,eError,#30-37 + eError,eError,eError,eError,eError,eError,eError,eError,#38-3f + eError,eError,eError, 5, 5, 5,eError,eError,#40-47 + eError,eError,eError,eError,eError,eError,eError,eError,#48-4f + eError,eError, 7, 7, 7, 7,eError,eError,#50-57 + eError,eError,eError,eError,eError,eError,eError,eError,#58-5f + eError,eError,eError,eError, 7, 7,eError,eError,#60-67 + eError,eError,eError,eError,eError,eError,eError,eError,#68-6f + eError,eError, 9, 9, 9, 9,eError,eError,#70-77 + eError,eError,eError,eError,eError,eError,eError,eError,#78-7f + eError,eError,eError,eError,eError, 9,eError,eError,#80-87 + eError,eError,eError,eError,eError,eError,eError,eError,#88-8f + eError,eError, 12, 12, 12, 12,eError,eError,#90-97 + eError,eError,eError,eError,eError,eError,eError,eError,#98-9f + eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 + eError,eError,eError,eError,eError,eError,eError,eError,#a8-af + eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 + eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf + eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 + eError,eError,eError,eError,eError,eError,eError,eError #c8-cf +) + +UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8SMModel = {'classTable': UTF8_cls, + 'classFactor': 16, + 'stateTable': UTF8_st, + 'charLenTable': UTF8CharLenTable, + 'name': 'UTF-8'} diff --git a/resources/scrapers/requests/packages/chardet/sbcharsetprober.py b/resources/scrapers/requests/packages/chardet/sbcharsetprober.py new file mode 100644 index 0000000..37291bd --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/sbcharsetprober.py @@ -0,0 +1,120 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from . import constants +from .charsetprober import CharSetProber +from .compat import wrap_ord + +SAMPLE_SIZE = 64 +SB_ENOUGH_REL_THRESHOLD = 1024 +POSITIVE_SHORTCUT_THRESHOLD = 0.95 +NEGATIVE_SHORTCUT_THRESHOLD = 0.05 +SYMBOL_CAT_ORDER = 250 +NUMBER_OF_SEQ_CAT = 4 +POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 +#NEGATIVE_CAT = 0 + + +class SingleByteCharSetProber(CharSetProber): + def __init__(self, model, reversed=False, nameProber=None): + CharSetProber.__init__(self) + self._mModel = model + # TRUE if we need to reverse every pair in the model lookup + self._mReversed = reversed + # Optional auxiliary prober for name decision + self._mNameProber = nameProber + self.reset() + + def reset(self): + CharSetProber.reset(self) + # char order of last character + self._mLastOrder = 255 + self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT + self._mTotalSeqs = 0 + self._mTotalChar = 0 + # characters that fall in our sampling range + self._mFreqChar = 0 + + def get_charset_name(self): + if self._mNameProber: + return self._mNameProber.get_charset_name() + else: + return self._mModel['charsetName'] + + def feed(self, aBuf): + if not self._mModel['keepEnglishLetter']: + aBuf = self.filter_without_english_letters(aBuf) + aLen = len(aBuf) + if not aLen: + return self.get_state() + for c in aBuf: + order = self._mModel['charToOrderMap'][wrap_ord(c)] + if order < SYMBOL_CAT_ORDER: + self._mTotalChar += 1 + if order < SAMPLE_SIZE: + self._mFreqChar += 1 + if self._mLastOrder < SAMPLE_SIZE: + self._mTotalSeqs += 1 + if not self._mReversed: + i = (self._mLastOrder * SAMPLE_SIZE) + order + model = self._mModel['precedenceMatrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * SAMPLE_SIZE) + self._mLastOrder + model = self._mModel['precedenceMatrix'][i] + self._mSeqCounters[model] += 1 + self._mLastOrder = order + + if self.get_state() == constants.eDetecting: + if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: + cf = self.get_confidence() + if cf > POSITIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, we have a' + 'winner\n' % + (self._mModel['charsetName'], cf)) + self._mState = constants.eFoundIt + elif cf < NEGATIVE_SHORTCUT_THRESHOLD: + if constants._debug: + sys.stderr.write('%s confidence = %s, below negative' + 'shortcut threshhold %s\n' % + (self._mModel['charsetName'], cf, + NEGATIVE_SHORTCUT_THRESHOLD)) + self._mState = constants.eNotMe + + return self.get_state() + + def get_confidence(self): + r = 0.01 + if self._mTotalSeqs > 0: + r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs + / self._mModel['mTypicalPositiveRatio']) + r = r * self._mFreqChar / self._mTotalChar + if r >= 1.0: + r = 0.99 + return r diff --git a/resources/scrapers/requests/packages/chardet/sbcsgroupprober.py b/resources/scrapers/requests/packages/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..1b6196c --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/sbcsgroupprober.py @@ -0,0 +1,69 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + CharSetGroupProber.__init__(self) + self._mProbers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + SingleByteCharSetProber(Latin2HungarianModel), + SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + ] + hebrewProber = HebrewProber() + logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrewProber) + visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrewProber) + hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) + self._mProbers.extend([hebrewProber, logicalHebrewProber, + visualHebrewProber]) + + self.reset() diff --git a/resources/scrapers/requests/packages/chardet/sjisprober.py b/resources/scrapers/requests/packages/chardet/sjisprober.py new file mode 100644 index 0000000..cd0e9e7 --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/sjisprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJISSMModel +from . import constants + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + MultiByteCharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(SJISSMModel) + self._mDistributionAnalyzer = SJISDistributionAnalysis() + self._mContextAnalyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + MultiByteCharSetProber.reset(self) + self._mContextAnalyzer.reset() + + def get_charset_name(self): + return self._mContextAnalyzer.get_charset_name() + + def feed(self, aBuf): + aLen = len(aBuf) + for i in range(0, aLen): + codingState = self._mCodingSM.next_state(aBuf[i]) + if codingState == constants.eError: + if constants._debug: + sys.stderr.write(self.get_charset_name() + + ' prober hit error at byte ' + str(i) + + '\n') + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + charLen = self._mCodingSM.get_current_charlen() + if i == 0: + self._mLastChar[1] = aBuf[0] + self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:], + charLen) + self._mDistributionAnalyzer.feed(self._mLastChar, charLen) + else: + self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3 + - charLen], charLen) + self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], + charLen) + + self._mLastChar[0] = aBuf[aLen - 1] + + if self.get_state() == constants.eDetecting: + if (self._mContextAnalyzer.got_enough_data() and + (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + contxtCf = self._mContextAnalyzer.get_confidence() + distribCf = self._mDistributionAnalyzer.get_confidence() + return max(contxtCf, distribCf) diff --git a/resources/scrapers/requests/packages/chardet/universaldetector.py b/resources/scrapers/requests/packages/chardet/universaldetector.py new file mode 100644 index 0000000..476522b --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/universaldetector.py @@ -0,0 +1,170 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +import sys +import codecs +from .latin1prober import Latin1Prober # windows-1252 +from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets +from .sbcsgroupprober import SBCSGroupProber # single-byte character sets +from .escprober import EscCharSetProber # ISO-2122, etc. +import re + +MINIMUM_THRESHOLD = 0.20 +ePureAscii = 0 +eEscAscii = 1 +eHighbyte = 2 + + +class UniversalDetector: + def __init__(self): + self._highBitDetector = re.compile(b'[\x80-\xFF]') + self._escDetector = re.compile(b'(\033|~{)') + self._mEscCharSetProber = None + self._mCharSetProbers = [] + self.reset() + + def reset(self): + self.result = {'encoding': None, 'confidence': 0.0} + self.done = False + self._mStart = True + self._mGotData = False + self._mInputState = ePureAscii + self._mLastChar = b'' + if self._mEscCharSetProber: + self._mEscCharSetProber.reset() + for prober in self._mCharSetProbers: + prober.reset() + + def feed(self, aBuf): + if self.done: + return + + aLen = len(aBuf) + if not aLen: + return + + if not self._mGotData: + # If the data starts with BOM, we know it is UTF + if aBuf[:3] == codecs.BOM_UTF8: + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", 'confidence': 1.0} + elif aBuf[:4] == codecs.BOM_UTF32_LE: + # FF FE 00 00 UTF-32, little-endian BOM + self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} + elif aBuf[:4] == codecs.BOM_UTF32_BE: + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32BE", 'confidence': 1.0} + elif aBuf[:4] == b'\xFE\xFF\x00\x00': + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = { + 'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0 + } + elif aBuf[:4] == b'\x00\x00\xFF\xFE': + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = { + 'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0 + } + elif aBuf[:2] == codecs.BOM_LE: + # FF FE UTF-16, little endian BOM + self.result = {'encoding': "UTF-16LE", 'confidence': 1.0} + elif aBuf[:2] == codecs.BOM_BE: + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16BE", 'confidence': 1.0} + + self._mGotData = True + if self.result['encoding'] and (self.result['confidence'] > 0.0): + self.done = True + return + + if self._mInputState == ePureAscii: + if self._highBitDetector.search(aBuf): + self._mInputState = eHighbyte + elif ((self._mInputState == ePureAscii) and + self._escDetector.search(self._mLastChar + aBuf)): + self._mInputState = eEscAscii + + self._mLastChar = aBuf[-1:] + + if self._mInputState == eEscAscii: + if not self._mEscCharSetProber: + self._mEscCharSetProber = EscCharSetProber() + if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: + self.result = {'encoding': self._mEscCharSetProber.get_charset_name(), + 'confidence': self._mEscCharSetProber.get_confidence()} + self.done = True + elif self._mInputState == eHighbyte: + if not self._mCharSetProbers: + self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), + Latin1Prober()] + for prober in self._mCharSetProbers: + if prober.feed(aBuf) == constants.eFoundIt: + self.result = {'encoding': prober.get_charset_name(), + 'confidence': prober.get_confidence()} + self.done = True + break + + def close(self): + if self.done: + return + if not self._mGotData: + if constants._debug: + sys.stderr.write('no data received!\n') + return + self.done = True + + if self._mInputState == ePureAscii: + self.result = {'encoding': 'ascii', 'confidence': 1.0} + return self.result + + if self._mInputState == eHighbyte: + proberConfidence = None + maxProberConfidence = 0.0 + maxProber = None + for prober in self._mCharSetProbers: + if not prober: + continue + proberConfidence = prober.get_confidence() + if proberConfidence > maxProberConfidence: + maxProberConfidence = proberConfidence + maxProber = prober + if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): + self.result = {'encoding': maxProber.get_charset_name(), + 'confidence': maxProber.get_confidence()} + return self.result + + if constants._debug: + sys.stderr.write('no probers hit minimum threshhold\n') + for prober in self._mCharSetProbers[0].mProbers: + if not prober: + continue + sys.stderr.write('%s confidence = %s\n' % + (prober.get_charset_name(), + prober.get_confidence())) diff --git a/resources/scrapers/requests/packages/chardet/utf8prober.py b/resources/scrapers/requests/packages/chardet/utf8prober.py new file mode 100644 index 0000000..1c0bb5d --- /dev/null +++ b/resources/scrapers/requests/packages/chardet/utf8prober.py @@ -0,0 +1,76 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from . import constants +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8SMModel + +ONE_CHAR_PROB = 0.5 + + +class UTF8Prober(CharSetProber): + def __init__(self): + CharSetProber.__init__(self) + self._mCodingSM = CodingStateMachine(UTF8SMModel) + self.reset() + + def reset(self): + CharSetProber.reset(self) + self._mCodingSM.reset() + self._mNumOfMBChar = 0 + + def get_charset_name(self): + return "utf-8" + + def feed(self, aBuf): + for c in aBuf: + codingState = self._mCodingSM.next_state(c) + if codingState == constants.eError: + self._mState = constants.eNotMe + break + elif codingState == constants.eItsMe: + self._mState = constants.eFoundIt + break + elif codingState == constants.eStart: + if self._mCodingSM.get_current_charlen() >= 2: + self._mNumOfMBChar += 1 + + if self.get_state() == constants.eDetecting: + if self.get_confidence() > constants.SHORTCUT_THRESHOLD: + self._mState = constants.eFoundIt + + return self.get_state() + + def get_confidence(self): + unlike = 0.99 + if self._mNumOfMBChar < 6: + for i in range(0, self._mNumOfMBChar): + unlike = unlike * ONE_CHAR_PROB + return 1.0 - unlike + else: + return unlike diff --git a/resources/scrapers/requests/packages/urllib3/__init__.py b/resources/scrapers/requests/packages/urllib3/__init__.py new file mode 100644 index 0000000..dfc82d0 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/__init__.py @@ -0,0 +1,66 @@ +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = 'dev' + + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s' % __name__) + return handler + +# ... Clean up. +del NullHandler + + +# Set security warning to only go off once by default. +import warnings +warnings.simplefilter('always', exceptions.SecurityWarning) + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/resources/scrapers/requests/packages/urllib3/__init__.pyc b/resources/scrapers/requests/packages/urllib3/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01d290990b398203f4fab1cd49246fe109b61cb8 GIT binary patch literal 2936 zcmd5;ZEq7t5T3IgCvo0iX%Z;chEP)#f9aPBAw+m-L4^oif@rUnuE*WlzGUyt?Cu4O z!Y5GwVt+_~K>N(Djn%6COwZcQ&g|^&ygW0L`X5WJ^7o6AgvQ?t{@%sVryfyC6k_%$ z^eC-SSfjK~VV%+jr86WOl+RE&LwS?JCgrmf&XUJ_O_Fnz&r>+>=vk62$`>eHaP%C> zMaq{bT%vrL!ez==C|q%S^CVX(U!!o%(Jhkely6YD;phdDo0M-+xaH_YlG~JDqVSTV zmq>m_`3{9UpqD9KA-PN8E{!&c$yFxvJqq{8dr^E%4RM*yTBH^|eCZmAT{^u&J=nWW zABf%){S485 zVxCS9=zR?bu)0p^mObzlt9abrW}knDsZ}W{vzOocH~o`=5^;J{$35XEWl@O4WM$zG z%Ti`V-;aybSK?-+L3CQWjl+jUs>H~DCX6c2{Wc^(c7~R`s|WGh@^z;W=7y<5`03*l z`!^Nm8G=o1W}0CX8h;hRpcKdo0Mh2SN|= zpl~lTH;>OmG=MjS8tX9!ZeN&aP-^4kX2Chha#2=e2IoQm-;J_A@f|rSR_>^h@)4XX zg$h9?5f-|9ZsFsXZ(=2_7_91b7Ai`}4%LH4^pmTA_F(-gkw4rSHPiq3hK zin3!$r9@$b>MEhjN+m*fb)w=S-=)N>N@#;4adL(L=k6j=mBQC_B%1Q{^6rY6|cC$_`J?<&-?HZ;A2!@`Nc!-nTqEDRCq zp{a4czrzA#ozwqajV@|*+OV7%u9Ohqns9*{(d4}eF-sS&TJX*sS5w@!ZFg%3J-?=Z z!_@NeJrWX;@R1e%t13&*`ZwA7bWgm&s@d1WjCHbJeClxQN zKBA8DU}=E4QiZlh1`fY|+ye|I*Jq|<1@!?`IcUck6(<)rw13c+;#^3Ms-<$FHK1`r z>u(@=n5H82V_zHOm$KThvXdvEq*L&gf1um*IAA!}m=wfqg!B{E*>DVeOy^d9Z$Y}=_`*hYXN+ph5;bQksWL)I3d?-aPlZc!vqb!odM)XTH z`u})*6HQKDH#Yz;VW%9AU#g!S93M4m&D3Vzs(0xAA=cuY^fS@^U z({9O)JmAt9aQX*a?hz%d7@`)#@R%5)K?U3a?CpFecYQJ7BnsG(fz2sip`6>!7jQyY z*HGA*o literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/__init__.pyo b/resources/scrapers/requests/packages/urllib3/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..01d290990b398203f4fab1cd49246fe109b61cb8 GIT binary patch literal 2936 zcmd5;ZEq7t5T3IgCvo0iX%Z;chEP)#f9aPBAw+m-L4^oif@rUnuE*WlzGUyt?Cu4O z!Y5GwVt+_~K>N(Djn%6COwZcQ&g|^&ygW0L`X5WJ^7o6AgvQ?t{@%sVryfyC6k_%$ z^eC-SSfjK~VV%+jr86WOl+RE&LwS?JCgrmf&XUJ_O_Fnz&r>+>=vk62$`>eHaP%C> zMaq{bT%vrL!ez==C|q%S^CVX(U!!o%(Jhkely6YD;phdDo0M-+xaH_YlG~JDqVSTV zmq>m_`3{9UpqD9KA-PN8E{!&c$yFxvJqq{8dr^E%4RM*yTBH^|eCZmAT{^u&J=nWW zABf%){S485 zVxCS9=zR?bu)0p^mObzlt9abrW}knDsZ}W{vzOocH~o`=5^;J{$35XEWl@O4WM$zG z%Ti`V-;aybSK?-+L3CQWjl+jUs>H~DCX6c2{Wc^(c7~R`s|WGh@^z;W=7y<5`03*l z`!^Nm8G=o1W}0CX8h;hRpcKdo0Mh2SN|= zpl~lTH;>OmG=MjS8tX9!ZeN&aP-^4kX2Chha#2=e2IoQm-;J_A@f|rSR_>^h@)4XX zg$h9?5f-|9ZsFsXZ(=2_7_91b7Ai`}4%LH4^pmTA_F(-gkw4rSHPiq3hK zin3!$r9@$b>MEhjN+m*fb)w=S-=)N>N@#;4adL(L=k6j=mBQC_B%1Q{^6rY6|cC$_`J?<&-?HZ;A2!@`Nc!-nTqEDRCq zp{a4czrzA#ozwqajV@|*+OV7%u9Ohqns9*{(d4}eF-sS&TJX*sS5w@!ZFg%3J-?=Z z!_@NeJrWX;@R1e%t13&*`ZwA7bWgm&s@d1WjCHbJeClxQN zKBA8DU}=E4QiZlh1`fY|+ye|I*Jq|<1@!?`IcUck6(<)rw13c+;#^3Ms-<$FHK1`r z>u(@=n5H82V_zHOm$KThvXdvEq*L&gf1um*IAA!}m=wfqg!B{E*>DVeOy^d9Z$Y}=_`*hYXN+ph5;bQksWL)I3d?-aPlZc!vqb!odM)XTH z`u})*6HQKDH#Yz;VW%9AU#g!S93M4m&D3Vzs(0xAA=cuY^fS@^U z({9O)JmAt9aQX*a?hz%d7@`)#@R%5)K?U3a?CpFecYQJ7BnsG(fz2sip`6>!7jQyY z*HGA*o literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/_collections.py b/resources/scrapers/requests/packages/urllib3/_collections.py new file mode 100644 index 0000000..784342a --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/_collections.py @@ -0,0 +1,198 @@ +from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +try: # Python 2.7+ + from collections import OrderedDict +except ImportError: + from .packages.ordered_dict import OrderedDict +from .packages.six import iterkeys, itervalues + + +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + + If you want to access the raw headers with their original casing + for debugging purposes you can access the private ``._data`` attribute + which is a normal python ``dict`` that maps the case-insensitive key to a + list of tuples stored as (case-sensitive-original-name, value). Using the + structure from above as our example: + + >>> headers._data + {'set-cookie': [('Set-Cookie', 'foo=bar'), ('set-cookie', 'baz=quxx')], + 'content-length': [('content-length', '7')]} + """ + + def __init__(self, headers=None, **kwargs): + self._data = {} + if headers is None: + headers = {} + self.update(headers, **kwargs) + + def add(self, key, value): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + self._data.setdefault(key.lower(), []).append((key, value)) + + def getlist(self, key): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + return self[key].split(', ') if key in self else [] + + def copy(self): + h = HTTPHeaderDict() + for key in self._data: + for rawkey, value in self._data[key]: + h.add(rawkey, value) + return h + + def __eq__(self, other): + if not isinstance(other, Mapping): + return False + other = HTTPHeaderDict(other) + return dict((k1, self[k1]) for k1 in self._data) == \ + dict((k2, other[k2]) for k2 in other._data) + + def __getitem__(self, key): + values = self._data[key.lower()] + return ', '.join(value[1] for value in values) + + def __setitem__(self, key, value): + self._data[key.lower()] = [(key, value)] + + def __delitem__(self, key): + del self._data[key.lower()] + + def __len__(self): + return len(self._data) + + def __iter__(self): + for headers in itervalues(self._data): + yield headers[0][0] + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, dict(self.items())) diff --git a/resources/scrapers/requests/packages/urllib3/_collections.pyc b/resources/scrapers/requests/packages/urllib3/_collections.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f4046e8cafae87370f02f5b5a067a944ca3b81f GIT binary patch literal 11222 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/connection.pyo b/resources/scrapers/requests/packages/urllib3/connection.pyo new file mode 100644 index 0000000000000000000000000000000000000000..ab3f077ddf042c4eb07a16c27f5b1a006cf908b3 GIT binary patch literal 9038 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/connectionpool.py b/resources/scrapers/requests/packages/urllib3/connectionpool.py new file mode 100644 index 0000000..70ee4ee --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/connectionpool.py @@ -0,0 +1,761 @@ +import errno +import logging +import sys +import warnings + +from socket import error as SocketError, timeout as SocketTimeout +import socket + +try: # Python 3 + from queue import LifoQueue, Empty, Full +except ImportError: + from Queue import LifoQueue, Empty, Full + import Queue as _ # Platform-specific: Windows + + +from .exceptions import ( + ClosedPoolError, + ProtocolError, + EmptyPoolError, + HostChangedError, + LocationValueError, + MaxRetryError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, + InsecureRequestWarning, +) +from .packages.ssl_match_hostname import CertificateError +from .packages import six +from .connection import ( + port_by_scheme, + DummyConnection, + HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, + HTTPException, BaseSSLError, ConnectionError +) +from .request import RequestMethods +from .response import HTTPResponse + +from .util.connection import is_connection_dropped +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host + + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +## Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + # httplib doesn't like it when we include brackets in ipv6 addresses + self.host = host.strip('[]') + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to false, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.connectionpool.ProxyManager`" + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = 'http' + ConnectionCls = HTTPConnection + + def __init__(self, host, port=None, strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.info("Starting new HTTP connection (%d): %s" % + (self.num_connections, self.host)) + + conn = self.ConnectionCls(host=self.host, port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.info("Resetting dropped connection: %s" % self.host) + conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s" % + self.host) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _get_timeout(self, timeout): + """ Helper that always returns a :class:`urllib3.util.Timeout` """ + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python 2.6 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, + **httplib_request_kw): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + conn.request(method, url, **httplib_request_kw) + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, 'sock', None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: # Python 2.7+, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 2.6 and older + httplib_response = conn.getresponse() + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("\"%s %s %s\" %s %s" % (method, url, http_version, + httplib_response.status, + httplib_response.length)) + return httplib_response + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param \**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + conn = None + + # Merge the proxy headers. Only do this in HTTP. We have to copy the + # headers dict so we can safely change it without those changes being + # reflected in anyone else's copy. + if self.scheme == 'http': + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + try: + # Request a connection from the queue. + conn = self._get_conn(timeout=pool_timeout) + + # Make the request on the httplib connection object. + httplib_response = self._make_request(conn, method, url, + timeout=timeout, + body=body, headers=headers) + + # If we're going to release the connection in ``finally:``, then + # the request doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = not release_conn and conn + + # Import httplib's response into our own wrapper object + response = HTTPResponse.from_httplib(httplib_response, + pool=self, + connection=response_conn, + **response_kw) + + # else: + # The connection will be put back into the pool when + # ``response.release_conn()`` is called (implicitly by + # ``response.read()``) + + except Empty: + # Timed out by queue. + raise EmptyPoolError(self, "No pool connections are available.") + + except (BaseSSLError, CertificateError) as e: + # Close the connection. If a connection is reused on which there + # was a Certificate error, the next request will certainly raise + # another Certificate error. + if conn: + conn.close() + conn = None + raise SSLError(e) + + except (TimeoutError, HTTPException, SocketError, ConnectionError) as e: + if conn: + # Discard the connection for these exceptions. It will be + # be replaced during the next _get_conn() call. + conn.close() + conn = None + + stacktrace = sys.exc_info()[2] + if isinstance(e, SocketError) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, + _pool=self, _stacktrace=stacktrace) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if release_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning("Retrying (%r) after connection " + "broken by '%r': %s" % (retries, err, url)) + return self.urlopen(method, url, body, headers, retries, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, **response_kw) + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + log.info("Redirecting %s -> %s" % (url, redirect_location)) + return self.urlopen(method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, **response_kw) + + # Check if we should retry the HTTP response. + if retries.is_forced_retry(method, status_code=response.status): + retries = retries.increment(method, url, response=response, _pool=self) + retries.sleep() + log.info("Forced retry: %s" % url) + return self.urlopen(method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs`` and + ``ssl_version`` are only used if :mod:`ssl` is available and are fed into + :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket + into an SSL socket. + """ + + scheme = 'https' + ConnectionCls = HTTPSConnection + + def __init__(self, host, port=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, + _proxy=None, _proxy_headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None, + **conn_kw): + + HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert(key_file=self.key_file, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + conn.ssl_version = self.ssl_version + + if self.proxy is not None: + # Python 2.7+ + try: + set_tunnel = conn.set_tunnel + except AttributeError: # Platform-specific: Python 2.6 + set_tunnel = conn._set_tunnel + + if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older + set_tunnel(self.host, self.port) + else: + set_tunnel(self.host, self.port, self.proxy_headers) + + # Establish tunnel connection early, because otherwise httplib + # would improperly set Host: header to proxy's IP:port. + conn.connect() + + return conn + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.info("Starting new HTTPS connection (%d): %s" + % (self.num_connections, self.host)) + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + # Platform-specific: Python without ssl + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls(host=actual_host, port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.org/en/latest/security.html'), + InsecureRequestWarning) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) diff --git a/resources/scrapers/requests/packages/urllib3/connectionpool.pyc b/resources/scrapers/requests/packages/urllib3/connectionpool.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab04e3990e9b9b47995188c08e8bd3daa425782a GIT binary patch literal 24618 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

    (xEBS>4nFRV!9@P@dDwBV$RO!x|9oEAAG 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 C!62Cc literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/connectionpool.pyo b/resources/scrapers/requests/packages/urllib3/connectionpool.pyo new file mode 100644 index 0000000000000000000000000000000000000000..ab04e3990e9b9b47995188c08e8bd3daa425782a GIT binary patch literal 24618 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

    (xEBS>4nFRV!9@P@dDwBV$RO!x|9oEAAG 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 C!62Cc literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/contrib/__init__.py b/resources/scrapers/requests/packages/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/resources/scrapers/requests/packages/urllib3/contrib/__init__.pyc b/resources/scrapers/requests/packages/urllib3/contrib/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b947cfa8144e23f32cbdd7cd82cb549806f5467 GIT binary patch literal 217 zcmZ9Gu?hk)42CN@h~RtNbc>saD7py_9&Ul7*M_5b*Vd#}TpWBF-_I8?2Tlh5FXRsi z|M)YX-JkEus9%kwZ$vy1Sf#3BaE^sQ{efTN?Urz6B!;c+ori6Vd!00#f|jv`L$D6C zwZSvQF1OB?H)k=FDG;GgNI=LTlR*YHq~q|5@S2g6oM>~=t*kP2oog0gf=}ccsB7n4 Vs_Qa7(o|xs`e1X1>me+Q)EDZzK8XMT literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/contrib/__init__.pyo b/resources/scrapers/requests/packages/urllib3/contrib/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..9b947cfa8144e23f32cbdd7cd82cb549806f5467 GIT binary patch literal 217 zcmZ9Gu?hk)42CN@h~RtNbc>saD7py_9&Ul7*M_5b*Vd#}TpWBF-_I8?2Tlh5FXRsi z|M)YX-JkEus9%kwZ$vy1Sf#3BaE^sQ{efTN?Urz6B!;c+ori6Vd!00#f|jv`L$D6C zwZSvQF1OB?H)k=FDG;GgNI=LTlR*YHq~q|5@S2g6oM>~=t*kP2oog0gf=}ccsB7n4 Vs_Qa7(o|xs`e1X1>me+Q)EDZzK8XMT literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/contrib/ntlmpool.py b/resources/scrapers/requests/packages/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..c6b266f --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/contrib/ntlmpool.py @@ -0,0 +1,114 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" + +try: + from http.client import HTTPSConnection +except ImportError: + from httplib import HTTPSConnection +from logging import getLogger +from ntlm import ntlm + +from urllib3 import HTTPSConnectionPool + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s' % + (self.num_connections, self.host, self.authurl)) + + headers = {} + headers['Connection'] = 'Keep-Alive' + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s' % headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s' % (res.status, res.reason)) + log.debug('Response headers: %s' % reshdr) + log.debug('Response data: %s [...]' % res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s' % headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s' % (res.status, res.reason)) + log.debug('Response headers: %s' % dict(res.getheaders())) + log.debug('Response data: %s [...]' % res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/resources/scrapers/requests/packages/urllib3/contrib/pyopenssl.py b/resources/scrapers/requests/packages/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..8229090 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/contrib/pyopenssl.py @@ -0,0 +1,303 @@ +'''SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* pyOpenSSL (tested with 0.13) +* ndg-httpsclient (tested with 0.3.2) +* pyasn1 (tested with 0.1.6) + +You can install them with the following command: + + pip install pyopenssl ndg-httpsclient pyasn1 + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +Module Variables +---------------- + +:var DEFAULT_SSL_CIPHER_LIST: The list of supported SSL/TLS cipher suites. + Default: ``ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES: + ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS`` + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) + +''' + +try: + from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT + from ndg.httpsclient.subj_alt_name import SubjectAltName as BaseSubjectAltName +except SyntaxError as e: + raise ImportError(e) + +import OpenSSL.SSL +from pyasn1.codec.der import decoder as der_decoder +from pyasn1.type import univ, constraint +from socket import _fileobject, timeout +import ssl +import select + +from .. import connection +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI only *really* works if we can read the subjectAltName of certificates. +HAS_SNI = SUBJ_ALT_NAME_SUPPORT + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + +_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER + + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM over any AES-CBC for better performance and security, +# - use 3DES as fallback which is secure but slow, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_SSL_CIPHER_LIST = "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:" + \ + "ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:" + \ + "!aNULL:!MD5:!DSS" + + +orig_util_HAS_SNI = util.HAS_SNI +orig_connection_ssl_wrap_socket = connection.ssl_wrap_socket + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + connection.ssl_wrap_socket = ssl_wrap_socket + util.HAS_SNI = HAS_SNI + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + connection.ssl_wrap_socket = orig_connection_ssl_wrap_socket + util.HAS_SNI = orig_util_HAS_SNI + + +### Note: This is a slightly bug-fixed version of same from ndg-httpsclient. +class SubjectAltName(BaseSubjectAltName): + '''ASN.1 implementation for subjectAltNames support''' + + # There is no limit to how many SAN certificates a certificate may have, + # however this needs to have some limit so we'll set an arbitrarily high + # limit. + sizeSpec = univ.SequenceOf.sizeSpec + \ + constraint.ValueSizeConstraint(1, 1024) + + +### Note: This is a slightly bug-fixed version of same from ndg-httpsclient. +def get_subj_alt_name(peer_cert): + # Search through extensions + dns_name = [] + if not SUBJ_ALT_NAME_SUPPORT: + return dns_name + + general_names = SubjectAltName() + for i in range(peer_cert.get_extension_count()): + ext = peer_cert.get_extension(i) + ext_name = ext.get_short_name() + if ext_name != 'subjectAltName': + continue + + # PyOpenSSL returns extension data in ASN.1 encoded form + ext_dat = ext.get_data() + decoded_dat = der_decoder.decode(ext_dat, + asn1Spec=general_names) + + for name in decoded_dat: + if not isinstance(name, SubjectAltName): + continue + for entry in range(len(name)): + component = name.getComponentByPosition(entry) + if component.getName() != 'dNSName': + continue + dns_name.append(str(component.getComponent())) + + return dns_name + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + + def fileno(self): + return self.socket.fileno() + + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + rd, wd, ed = select.select( + [self.socket], [], [], self.socket.gettimeout()) + if not rd: + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + _, wlist, _ = select.select([], [self.socket], [], + self.socket.gettimeout()) + if not wlist: + raise timeout() + continue + + def sendall(self, data): + while len(data): + sent = self._send_until_done(data) + data = data[sent:] + + def close(self): + if self._makefile_refs < 1: + return self.connection.shutdown() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': [ + ('DNS', value) + for value in get_subj_alt_name(x509) + ] + } + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None): + ctx = OpenSSL.SSL.Context(_openssl_versions[ssl_version]) + if certfile: + keyfile = keyfile or certfile # Match behaviour of the normal python ssl library + ctx.use_certificate_file(certfile) + if keyfile: + ctx.use_privatekey_file(keyfile) + if cert_reqs != ssl.CERT_NONE: + ctx.set_verify(_openssl_verify[cert_reqs], _verify_callback) + if ca_certs: + try: + ctx.load_verify_locations(ca_certs, None) + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad ca_certs: %r' % ca_certs, e) + else: + ctx.set_default_verify_paths() + + # Disable TLS compression to migitate CRIME attack (issue #309) + OP_NO_COMPRESSION = 0x20000 + ctx.set_options(OP_NO_COMPRESSION) + + # Set list of supported ciphersuites. + ctx.set_cipher_list(DEFAULT_SSL_CIPHER_LIST) + + cnx = OpenSSL.SSL.Connection(ctx, sock) + cnx.set_tlsext_host_name(server_hostname) + cnx.set_connect_state() + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + select.select([sock], [], []) + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake', e) + break + + return WrappedSocket(cnx, sock) diff --git a/resources/scrapers/requests/packages/urllib3/contrib/pyopenssl.pyc b/resources/scrapers/requests/packages/urllib3/contrib/pyopenssl.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6e8d35c010955d406310f8f49d1ba94de92c7b0 GIT binary patch literal 11613 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 WfQvOzp1g3X{Iv@|D36t)X8#RFJkeYL literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/contrib/pyopenssl.pyo b/resources/scrapers/requests/packages/urllib3/contrib/pyopenssl.pyo new file mode 100644 index 0000000000000000000000000000000000000000..c6e8d35c010955d406310f8f49d1ba94de92c7b0 GIT binary patch literal 11613 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 WfQvOzp1g3X{Iv@|D36t)X8#RFJkeYL literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/exceptions.py b/resources/scrapers/requests/packages/urllib3/exceptions.py new file mode 100644 index 0000000..0c6fd3c --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/exceptions.py @@ -0,0 +1,159 @@ + +## Base Exceptions + +class HTTPError(Exception): + "Base exception used by this module." + pass + +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + "Base exception for PoolErrors that have associated URLs." + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class ProxyError(HTTPError): + "Raised when the connection to a proxy fails." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +## Leaf Exceptions + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """ Raised when passing an invalid state to a timeout """ + pass + + +class TimeoutError(HTTPError): + """ Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + ` and :exc:`ConnectTimeoutErrors `. + """ + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + "Raised when a socket timeout occurs while receiving data from a server" + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + "Raised when a socket timeout occurs while connecting to a server" + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when perfoming security reducing actions" + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass diff --git a/resources/scrapers/requests/packages/urllib3/exceptions.pyc b/resources/scrapers/requests/packages/urllib3/exceptions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..922cad26967d4c6be000cb420968533824cf59ed GIT binary patch literal 10223 zcmdT~TXWn<748{dVmtTSB-v{(iFX~?OsLuyFd^)&9jJl%1(>) zOevjFX0H3}d?}q(W}z!RTT0I;bFM2rUrOhcxzLqfET!|x&Z`#-%3M-*M!tEuymwZa zD_!Z;QhH9AYu$dXm(ugf)Vk6erSyU_HNtK zlwMZmqptMhQhG%ht?X6#Cc6Hlym3vLA1HfGy1rdXuPbw>JHEwIT2tmzWvArX&r0bH zWtNn^A=100^rkXD>`H%BN^dFixmsVkht<#Lad@(^@q9JQ(yUYtsD%2O%5eb)Xaf0*M@lgul&8n*QwyG*d!2*c#nw!OO(Jkvm z=hc-nWaqN}h4RKpoI^wTrJVPjZEgpAQ53jkor50r*6Q?^iFS2~1LbH{Wxf(ouh=*T zLFznC0L{084sa>(@TjcGf8rh*ji?zq2V-SlYiVM|2L#lDF`9DWSu$%n5gg4mjLva^ zRdtEVF=ST(0SeCH(3^sso&M5swDh~8m~=by(>Vtkc(?Vv&Fm-W>liaDP1wPOhq>Mj z_pHXcr%@c{aP8j&&s;sC3Ur%jk%j?sxUO_-I})^svq2KAZx-!SYmgg zOkz+0rykI!^cLpy*MtLoAML0)ar6SjEu0kQgV$;JvcleR-fa&eys9c+lPkE zQ;nd_em!cF0S{y7U9=uNwA@EFN{u}sK0h16C+y^DE6n3a8+HdiskcC>jRu)sNkLwd z{NBc4yHK*pfa@~mSRa6kwg_#?(`Y0^9A$hDhX8YF%aZ)<=uTn}+ORT!wHvnEHbKS_ zn|lSZzYoseMoLiRALDL;S1`>lj$rod@F1{xHe`e(G+*=C_i(U%i5bW=iFKu)PoG23 z88*mPco4TbEuC~)TQ<|_w$AXC*usf9N#?AvroOPC@weO#v#=#Zds%M`S~CfWPs*eYe#f~Kz zdV+yD4i>pZb*gf{x^^tf7Mde0kB>^olf&sVx~muu9gKJEbF_6-b7IH0O5RB9EUX^@Hc>MP##AQ~&>ypHkw7Ol%VsyPGeM%=P#CtuIOJO{Ot zbCR$yDwNXE>3)@LBeSDALN()LFKos}JND~oTJFE3y(SDI)-&QUvE&<=+Y7WVSQW{Z z3$RXz(?5rC3N;eoS2ovONF<)STzE8^rzm`6fOr1a?@*pHh{l&o+=Z>5L^%Loq3 zF9REz{((6Oe-DPm4_{(kOz}<;Fb7`K4~~&Od|8+7CSuWU0%#QIibb12ZI$kK7>Ecm z`TL&={uqz->-Uj$^DBldE^d-pL^j@|{u`8&^>&uF;1E%0-m}?6z{l)%7p(&B7D|CP6B65hTX*q zDT&y1l45@(Lvf9**-ZDrxFh@P0sSIUhj*?$s#Dw|NvLRY+}n8S+!E3{)ty#GQpnBn~T=R)eQ2 zjnyFdO^`D(u0LO0dHT338aw*0F~q;3mBoH=Nrt6$3yL1+hbP{vzmJ#s5*9#e{`k$n zcFLa{fFSxVu~67#l=Mj|{eI(k-0O_DF|WT7sIt<}#QiDiq?nZr{O;oSMynORD)P!s z0yd3}65!~!MvCY@8Ik7>u=)D{T1>&$4_$6s%*9R&6sv{(YUQLW$txvlcU)1?M!4Cs zT4MJ^u);-5>>vF|tu4_b%5MkC@~r`2VG$Z0^5 z#QO$}m;vh}0V8}scNj1m3i!={3^gFvl3xS#XjMQW5zxB_ng`lKz$Fei`f>AV67L`Q r-$*?qPL6wPwdvYy?JWMy$iLayncCIbJkIBDo$<0;GqnXggZuvlP??NN literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/exceptions.pyo b/resources/scrapers/requests/packages/urllib3/exceptions.pyo new file mode 100644 index 0000000000000000000000000000000000000000..922cad26967d4c6be000cb420968533824cf59ed GIT binary patch literal 10223 zcmdT~TXWn<748{dVmtTSB-v{(iFX~?OsLuyFd^)&9jJl%1(>) zOevjFX0H3}d?}q(W}z!RTT0I;bFM2rUrOhcxzLqfET!|x&Z`#-%3M-*M!tEuymwZa zD_!Z;QhH9AYu$dXm(ugf)Vk6erSyU_HNtK zlwMZmqptMhQhG%ht?X6#Cc6Hlym3vLA1HfGy1rdXuPbw>JHEwIT2tmzWvArX&r0bH zWtNn^A=100^rkXD>`H%BN^dFixmsVkht<#Lad@(^@q9JQ(yUYtsD%2O%5eb)Xaf0*M@lgul&8n*QwyG*d!2*c#nw!OO(Jkvm z=hc-nWaqN}h4RKpoI^wTrJVPjZEgpAQ53jkor50r*6Q?^iFS2~1LbH{Wxf(ouh=*T zLFznC0L{084sa>(@TjcGf8rh*ji?zq2V-SlYiVM|2L#lDF`9DWSu$%n5gg4mjLva^ zRdtEVF=ST(0SeCH(3^sso&M5swDh~8m~=by(>Vtkc(?Vv&Fm-W>liaDP1wPOhq>Mj z_pHXcr%@c{aP8j&&s;sC3Ur%jk%j?sxUO_-I})^svq2KAZx-!SYmgg zOkz+0rykI!^cLpy*MtLoAML0)ar6SjEu0kQgV$;JvcleR-fa&eys9c+lPkE zQ;nd_em!cF0S{y7U9=uNwA@EFN{u}sK0h16C+y^DE6n3a8+HdiskcC>jRu)sNkLwd z{NBc4yHK*pfa@~mSRa6kwg_#?(`Y0^9A$hDhX8YF%aZ)<=uTn}+ORT!wHvnEHbKS_ zn|lSZzYoseMoLiRALDL;S1`>lj$rod@F1{xHe`e(G+*=C_i(U%i5bW=iFKu)PoG23 z88*mPco4TbEuC~)TQ<|_w$AXC*usf9N#?AvroOPC@weO#v#=#Zds%M`S~CfWPs*eYe#f~Kz zdV+yD4i>pZb*gf{x^^tf7Mde0kB>^olf&sVx~muu9gKJEbF_6-b7IH0O5RB9EUX^@Hc>MP##AQ~&>ypHkw7Ol%VsyPGeM%=P#CtuIOJO{Ot zbCR$yDwNXE>3)@LBeSDALN()LFKos}JND~oTJFE3y(SDI)-&QUvE&<=+Y7WVSQW{Z z3$RXz(?5rC3N;eoS2ovONF<)STzE8^rzm`6fOr1a?@*pHh{l&o+=Z>5L^%Loq3 zF9REz{((6Oe-DPm4_{(kOz}<;Fb7`K4~~&Od|8+7CSuWU0%#QIibb12ZI$kK7>Ecm z`TL&={uqz->-Uj$^DBldE^d-pL^j@|{u`8&^>&uF;1E%0-m}?6z{l)%7p(&B7D|CP6B65hTX*q zDT&y1l45@(Lvf9**-ZDrxFh@P0sSIUhj*?$s#Dw|NvLRY+}n8S+!E3{)ty#GQpnBn~T=R)eQ2 zjnyFdO^`D(u0LO0dHT338aw*0F~q;3mBoH=Nrt6$3yL1+hbP{vzmJ#s5*9#e{`k$n zcFLa{fFSxVu~67#l=Mj|{eI(k-0O_DF|WT7sIt<}#QiDiq?nZr{O;oSMynORD)P!s z0yd3}65!~!MvCY@8Ik7>u=)D{T1>&$4_$6s%*9R&6sv{(YUQLW$txvlcU)1?M!4Cs zT4MJ^u);-5>>vF|tu4_b%5MkC@~r`2VG$Z0^5 z#QO$}m;vh}0V8}scNj1m3i!={3^gFvl3xS#XjMQW5zxB_ng`lKz$Fei`f>AV67L`Q r-$*?qPL6wPwdvYy?JWMy$iLayncCIbJkIBDo$<0;GqnXggZuvlP??NN literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/fields.py b/resources/scrapers/requests/packages/urllib3/fields.py new file mode 100644 index 0000000..c853f8d --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/fields.py @@ -0,0 +1,177 @@ +import email.utils +import mimetypes + +from .packages import six + + +def guess_content_type(filename, default='application/octet-stream'): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param(name, value): + """ + Helper function to format and quote a single header parameter. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows RFC 2231, as + suggested by RFC 2388 Section 4.4. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + if not any(ch in value for ch in '"\\\r\n'): + result = '%s="%s"' % (name, value) + try: + result.encode('ascii') + except UnicodeEncodeError: + pass + else: + return result + if not six.PY3: # Python 2: + value = value.encode('utf-8') + value = email.utils.encode_rfc2231(value, 'utf-8') + value = '%s*=%s' % (name, value) + return value + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. + :param headers: + An optional dict-like object of headers to initially use for the field. + """ + def __init__(self, name, data, filename=None, headers=None): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + + @classmethod + def from_tuples(cls, fieldname, value): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls(fieldname, data, filename=filename) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + return format_header_param(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) typles or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value: + parts.append(self._render_part(name, value)) + + return '; '.join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append('%s: %s' % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append('%s: %s' % (header_name, header_value)) + + lines.append('\r\n') + return '\r\n'.join(lines) + + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers['Content-Disposition'] = content_disposition or 'form-data' + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) + self.headers['Content-Type'] = content_type + self.headers['Content-Location'] = content_location diff --git a/resources/scrapers/requests/packages/urllib3/fields.pyc b/resources/scrapers/requests/packages/urllib3/fields.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad0e8c1444557ced92c256632b95175e972d01bd GIT binary patch literal 7325 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 IU#_qI1>=*eE&u=k literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/filepost.pyo b/resources/scrapers/requests/packages/urllib3/filepost.pyo new file mode 100644 index 0000000000000000000000000000000000000000..0106a8e5405a9d0f01faed39a6e89aa23ce510f9 GIT binary patch literal 3669 zcmd5<-EJF26h6Cl65FxsG_6{CH@zq_A~v9wADL27nj!_%RBQ^BELZV*cN}lByR+Sy zO%s%GlZu=21l;fhT=6cv2oC_?nRVh8QK?8s#PS}`IkPi!=A7^RxbjD<@#1%S6wvJB z;`ehr`e%?3Ux#9%K{<9Qb|`Ua;F8006^bjARB2EJU!`z?;sr_;X|P!Gixe+WQlmkw z( z>P3Izv)OSlGz%a_5rwx(b_whkheqm+hY`=0(h5d8Iw%}q&8nhG7h!f z%}lzVM7-q8IK1Q@9^C*jL?^fdE5maA0Hh)Cd06B^CSyPMwT{xA_^_*^B#WiUWfuE^ zOk`@rMCBrh5^0o*buXAIrRDZm6=~?_hdsMbhkfDUA;VfssfRkq z{fzg@OJiV(AME)%m@4u(j>b2KlPH#%(x#Uknl_IAo8~QuH0w>(fUUxcSMdaR^bQED zb_D9siA(u)GA`{_SOOFrJCrubROjr$O*(RD{mHv@?An!}3wGr~Jlr4sFtbf>w(-kI8qJQ`>@Xq?<0b+qwDHqG;;IND?C!C) zrp}X46i=e<9CIGOWR^iDxk|Q6y*g}Hv&cew8Q7E8GHk8j{9t6&Dkk%7tJk&~?@Czn zGNhVAm}+fj)or>hr|r~S3z<{c+~ap{fxH5lw>kWgC0+*3I>56Px-15gEN2a*yV%RR zs@D^t%yJn31Yy4~KInZ^y8rdScr=v)aTA$HrHqR=^0r9)J)p)+BP}LH8t`JPfEsHR zOCx(?1J0LzxF!lMMW0{lkJ!(z8fdg8o=u}*ikxAJJk@UwI59Kvzr=T$a?WCw@um5> z4g#Y-xk^KqBNTy%kVLpmZ2VQYMwAI~vjm+*CgZvHzD4DprTgawk($Ho_Kr;DL6+b7 zknhOaF4BK=cW(u|c^8>5_Rs0PKZa_vdv`d&c$}WR8WXmL$40Vc&Ewj5ZZ2W-;5=G1 zE2cROQnT$`b%WBAM4Sk1{-_}XAb*_D47g}f_G+`j!$OoCqJv+#!j?s7{mCzM3NF?bPXiT7;oJI#JcYi4^W11umXy&5844W)l9?1q5t}IUbMqehmZTe^!w?TP9^B_P zCh^TI*Yxp*pUmoO-=-|?ht^Ty=KGhs3$#D;iYpJ--Ymbq^Xf^b{nGrbjfqH=5jvAW zgp-hFp?-=>=BVT<5vMD}vnY4@q&)bAn;)W0l}e9&<+0or^=I4^cok-O!m_#H0*W3k zMDduSq@ZytI|_Km#1;oNO)%|Q~BhUNbk9^~A7pxsiX%h-aaZE|U0HqNP}hyNSaan`P7 zGsiBBmD(#Z?+S)tr}AakSI(f{4<^F?nbDlB4ohrw#QxTd?}tndSRsZw96 IU#_qI1>=*eE&u=k literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/packages/__init__.py b/resources/scrapers/requests/packages/urllib3/packages/__init__.py new file mode 100644 index 0000000..37e8351 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/packages/__init__.py @@ -0,0 +1,4 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + diff --git a/resources/scrapers/requests/packages/urllib3/packages/__init__.pyc b/resources/scrapers/requests/packages/urllib3/packages/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbd698059fe488dbdaea389d15d78a99837cf965 GIT binary patch literal 345 zcmYLF%Sr?>5bT**K^8>u8$8TuF5X0B7rhA{X7REFLUs~ogL#?mC|eX0p}zaZi~cI_VWnd%2HDL3wl6FKTqjAmu}$l8uxjE1(MFcfPXz z5AdDo^@X@clToa-w?V8^x>2OW7!}J|+(vDM(mDnd$(7lL;n`{v2Z}kHKqiZ9FqS+S z6gXv->RZ`76@$bPH9e}Ct&*LyyYv48DQ&PM<&a+KkmtDcQ5R>f>YP}A@TC0$cB)wt literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/packages/__init__.pyo b/resources/scrapers/requests/packages/urllib3/packages/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..bbd698059fe488dbdaea389d15d78a99837cf965 GIT binary patch literal 345 zcmYLF%Sr?>5bT**K^8>u8$8TuF5X0B7rhA{X7REFLUs~ogL#?mC|eX0p}zaZi~cI_VWnd%2HDL3wl6FKTqjAmu}$l8uxjE1(MFcfPXz z5AdDo^@X@clToa-w?V8^x>2OW7!}J|+(vDM(mDnd$(7lL;n`{v2Z}kHKqiZ9FqS+S z6gXv->RZ`76@$bPH9e}Ct&*LyyYv48DQ&PM<&a+KkmtDcQ5R>f>YP}A@TC0$cB)wt literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/packages/ordered_dict.py b/resources/scrapers/requests/packages/urllib3/packages/ordered_dict.py new file mode 100644 index 0000000..4479363 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/packages/ordered_dict.py @@ -0,0 +1,259 @@ +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. +# Copyright 2009 Raymond Hettinger, released under the MIT License. +# http://code.activestate.com/recipes/576693/ +try: + from thread import get_ident as _get_ident +except ImportError: + from dummy_thread import get_ident as _get_ident + +try: + from _abcoll import KeysView, ValuesView, ItemsView +except ImportError: + pass + + +class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running={}): + 'od.__repr__() <==> repr(od)' + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) diff --git a/resources/scrapers/requests/packages/urllib3/packages/ordered_dict.pyc b/resources/scrapers/requests/packages/urllib3/packages/ordered_dict.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf8a2b0b15a9aa4b10fff9b32aa4afe303f2fd09 GIT binary patch literal 11839 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/packages/ordered_dict.pyo b/resources/scrapers/requests/packages/urllib3/packages/ordered_dict.pyo new file mode 100644 index 0000000000000000000000000000000000000000..cf8a2b0b15a9aa4b10fff9b32aa4afe303f2fd09 GIT binary patch literal 11839 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/packages/six.py b/resources/scrapers/requests/packages/urllib3/packages/six.py new file mode 100644 index 0000000..27d8011 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/packages/six.py @@ -0,0 +1,385 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +#Copyright (c) 2010-2011 Benjamin Peterson + +#Permission is hereby granted, free of charge, to any person obtaining a copy of +#this software and associated documentation files (the "Software"), to deal in +#the Software without restriction, including without limitation the rights to +#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +#the Software, and to permit persons to whom the Software is furnished to do so, +#subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in all +#copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.2.0" # Revision 41c74fef2ded + + +# True if we are running on Python 3. +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) + # This is a bit ugly, but it avoids running this again. + delattr(tp, self.name) + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + + +class _MovedItems(types.ModuleType): + """Lazy loading of moved objects""" + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("reload_module", "__builtin__", "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("winreg", "_winreg"), +] +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) +del attr + +moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_code = "__code__" + _func_defaults = "__defaults__" + + _iterkeys = "keys" + _itervalues = "values" + _iteritems = "items" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_code = "func_code" + _func_defaults = "func_defaults" + + _iterkeys = "iterkeys" + _itervalues = "itervalues" + _iteritems = "iteritems" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +if PY3: + def get_unbound_function(unbound): + return unbound + + Iterator = object + + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) +else: + def get_unbound_function(unbound): + return unbound.im_func + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) + + +def iterkeys(d): + """Return an iterator over the keys of a dictionary.""" + return iter(getattr(d, _iterkeys)()) + +def itervalues(d): + """Return an iterator over the values of a dictionary.""" + return iter(getattr(d, _itervalues)()) + +def iteritems(d): + """Return an iterator over the (key, value) pairs of a dictionary.""" + return iter(getattr(d, _iteritems)()) + + +if PY3: + def b(s): + return s.encode("latin-1") + def u(s): + return s + if sys.version_info[1] <= 1: + def int2byte(i): + return bytes((i,)) + else: + # This is about 2x faster than the implementation above on 3.2+ + int2byte = operator.methodcaller("to_bytes", 1, "big") + import io + StringIO = io.StringIO + BytesIO = io.BytesIO +else: + def b(s): + return s + def u(s): + return unicode(s, "unicode_escape") + int2byte = chr + import StringIO + StringIO = BytesIO = StringIO.StringIO +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +if PY3: + import builtins + exec_ = getattr(builtins, "exec") + + + def reraise(tp, value, tb=None): + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + + print_ = getattr(builtins, "print") + del builtins + +else: + def exec_(code, globs=None, locs=None): + """Execute code in a namespace.""" + if globs is None: + frame = sys._getframe(1) + globs = frame.f_globals + if locs is None: + locs = frame.f_locals + del frame + elif locs is None: + locs = globs + exec("""exec code in globs, locs""") + + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + + def print_(*args, **kwargs): + """The new-style print function.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + def write(data): + if not isinstance(data, basestring): + data = str(data) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) + +_add_doc(reraise, """Reraise an exception.""") + + +def with_metaclass(meta, base=object): + """Create a base class with a metaclass.""" + return meta("NewBase", (base,), {}) diff --git a/resources/scrapers/requests/packages/urllib3/packages/six.pyc b/resources/scrapers/requests/packages/urllib3/packages/six.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74776d2cb75d6571edc4f10170f28b46475fd0fa GIT binary patch literal 16171 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 Uilb$$x;Q>oENm!_92_hD7pH$1r2qf` literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/packages/six.pyo b/resources/scrapers/requests/packages/urllib3/packages/six.pyo new file mode 100644 index 0000000000000000000000000000000000000000..74776d2cb75d6571edc4f10170f28b46475fd0fa GIT binary patch literal 16171 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 Uilb$$x;Q>oENm!_92_hD7pH$1r2qf` literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py b/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..dd59a75 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,13 @@ +try: + # Python 3.2+ + from ssl import CertificateError, match_hostname +except ImportError: + try: + # Backport of the function from a pypi module + from backports.ssl_match_hostname import CertificateError, match_hostname + except ImportError: + # Our vendored copy + from ._implementation import CertificateError, match_hostname + +# Not needed, but documenting what we provide. +__all__ = ('CertificateError', 'match_hostname') diff --git a/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc b/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e935a607cec5037eca58b5a19e981bbfcee91b5 GIT binary patch literal 580 zcmZutO-lnY5S{E=6{YIAi07Vq@g^dc>Olk#En+Ew5I3=g=3|@8DuVbk{0;s;e}K-e z;-WQ>$;``pGcU>CyIYShZ<7MPSBK71+Uc3XQx6n?VqgIrgBb&t!7KxI&=djp< zxCF*n%Ut`zT*e=!tC=cm8g_ouh&A;LrfMB#>!3O?>2Ht$^FgbhQHFaIMmnOoGlfKb z9%G2OL!gsb+>85=&`YNcBWO$;#&veph|_=Kv?^|9Voti0Y}*943Au134g4CrPxY-V z7B!Lv#1+3y;4Tq_ai!Hxdz5H`$ND`&NNa`YQwnWJuT+kX_;u1T@u70Y^I=(@NtApX zB$ac18I<8tso)bYZ8bN3@L-e<0}L_J3>|sYDO9o0iKimUvhEf2veF4jLT=@puBvFQ oxjk%wRrg#7;|&TiD4%eXtR1_cDyvWG4{d%e&w8xOnwTBrpYdsz#Q*>R literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyo b/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..1e935a607cec5037eca58b5a19e981bbfcee91b5 GIT binary patch literal 580 zcmZutO-lnY5S{E=6{YIAi07Vq@g^dc>Olk#En+Ew5I3=g=3|@8DuVbk{0;s;e}K-e z;-WQ>$;``pGcU>CyIYShZ<7MPSBK71+Uc3XQx6n?VqgIrgBb&t!7KxI&=djp< zxCF*n%Ut`zT*e=!tC=cm8g_ouh&A;LrfMB#>!3O?>2Ht$^FgbhQHFaIMmnOoGlfKb z9%G2OL!gsb+>85=&`YNcBWO$;#&veph|_=Kv?^|9Voti0Y}*943Au134g4CrPxY-V z7B!Lv#1+3y;4Tq_ai!Hxdz5H`$ND`&NNa`YQwnWJuT+kX_;u1T@u70Y^I=(@NtApX zB$ac18I<8tso)bYZ8bN3@L-e<0}L_J3>|sYDO9o0iKimUvhEf2veF4jLT=@puBvFQ oxjk%wRrg#7;|&TiD4%eXtR1_cDyvWG4{d%e&w8xOnwTBrpYdsz#Q*>R literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py b/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 0000000..52f4287 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,105 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re + +__version__ = '3.4.0.2' + +class CertificateError(ValueError): + pass + + +def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyc b/resources/scrapers/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e44995da304207621dda025b4e1cc4528fbd693f GIT binary patch literal 3191 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 manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + def _new_pool(self, scheme, host, port): + """ + Create a new :class:`ConnectionPool` based on host, port and scheme. + + This method is used to actually create the connection pools handed out + by :meth:`connection_from_url` and companion methods. It is intended + to be overridden for customization. + """ + pool_cls = pool_classes_by_scheme[scheme] + kwargs = self.connection_pool_kw + if scheme == 'http': + kwargs = self.connection_pool_kw.copy() + for kw in SSL_KEYWORDS: + kwargs.pop(kw, None) + + return pool_cls(host, port, **kwargs) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http'): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. + """ + + if not host: + raise LocationValueError("No host specified.") + + scheme = scheme or 'http' + port = port or port_by_scheme.get(scheme, 80) + pool_key = (scheme, host, port) + + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + pool = self._new_pool(scheme, host, port) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url` but + doesn't pass any additional parameters to the + :class:`urllib3.connectionpool.ConnectionPool` constructor. + + Additional parameters are taken from the :class:`.PoolManager` + constructor. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + if 'headers' not in kw: + kw['headers'] = self.headers + + if self.proxy is not None and u.scheme == "http": + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = 'GET' + + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + kw['retries'] = retries.increment(method, redirect_location) + kw['redirect'] = redirect + + log.info("Redirecting %s -> %s" % (url, redirect_location)) + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary contaning headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + assert proxy.scheme in ("http", "https"), \ + 'Not supported proxy scheme %s' % proxy.scheme + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http'): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/resources/scrapers/requests/packages/urllib3/poolmanager.pyc b/resources/scrapers/requests/packages/urllib3/poolmanager.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0c32d3ce9a59cb1155a0ef960dc5451c375e34e GIT binary patch literal 10420 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 a;9UJ{v>Od)&RJ-*@z)~F#`51TKmKpZJ#k?G literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/poolmanager.pyo b/resources/scrapers/requests/packages/urllib3/poolmanager.pyo new file mode 100644 index 0000000000000000000000000000000000000000..b1a096240a813e18632ae9363e343011b6d268aa GIT binary patch literal 10295 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 MXf~GqYw6*i0XVo*n*aa+ literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/request.py b/resources/scrapers/requests/packages/urllib3/request.py new file mode 100644 index 0000000..b08d6c9 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/request.py @@ -0,0 +1,141 @@ +try: + from urllib.parse import urlencode +except ImportError: + from urllib import urlencode + +from .filepost import encode_multipart_formdata + + +__all__ = ['RequestMethods'] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`~urllib3.connectionpool.HTTPConnectionPool` and + :class:`~urllib3.poolmanager.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen(self, method, url, body=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **kw): # Abstract + raise NotImplemented("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + if method in self._encode_url_methods: + return self.request_encode_url(method, url, fields=fields, + headers=headers, + **urlopen_kw) + else: + return self.request_encode_body(method, url, fields=fields, + headers=headers, + **urlopen_kw) + + def request_encode_url(self, method, url, fields=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if fields: + url += '?' + urlencode(fields) + return self.urlopen(method, url, **urlopen_kw) + + def request_encode_body(self, method, url, fields=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :meth:`urllib.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimick behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': {}} + + if fields: + if 'body' in urlopen_kw: + raise TypeError('request got values for both \'fields\' and \'body\', can only specify one.') + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/resources/scrapers/requests/packages/urllib3/request.pyc b/resources/scrapers/requests/packages/urllib3/request.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e81148fbda3450cb6d841c0416b100a0ff8d6512 GIT binary patch literal 6401 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/request.pyo b/resources/scrapers/requests/packages/urllib3/request.pyo new file mode 100644 index 0000000000000000000000000000000000000000..e81148fbda3450cb6d841c0416b100a0ff8d6512 GIT binary patch literal 6401 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/response.py b/resources/scrapers/requests/packages/urllib3/response.py new file mode 100644 index 0000000..e69de95 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/response.py @@ -0,0 +1,333 @@ +import zlib +import io +from socket import timeout as SocketTimeout + +from ._collections import HTTPHeaderDict +from .exceptions import ProtocolError, DecodeError, ReadTimeoutError +from .packages.six import string_types as basestring, binary_type +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed + + + +class DeflateDecoder(object): + + def __init__(self): + self._first_try = True + self._data = binary_type() + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + return self._obj.decompress(data) + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +def _get_decoder(mode): + if mode == 'gzip': + return zlib.decompressobj(16 + zlib.MAX_WBITS) + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, attempts to decode specific content-encoding's based on headers + (like 'gzip' and 'deflate') will be skipped and raw data will be used + instead. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + """ + + CONTENT_DECODERS = ['gzip', 'deflate'] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None): + + self.headers = HTTPHeaderDict() + if headers: + self.headers.update(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + + if body and isinstance(body, (basestring, binary_type)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``HTTPResponse.read`` if bytes + are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + + try: + try: + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if not 'read operation timed out' in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except HTTPException as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + self._fp_bytes_read += len(data) + + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content and self._decoder: + buf = self._decoder.decompress(binary_type()) + data += buf + self._decoder.flush() + + if cache_content: + self._body = data + + return data + + finally: + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def stream(self, amt=2**16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + + headers = HTTPHeaderDict() + for k, v in r.getheaders(): + headers.add(k, v) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + return ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + @property + def closed(self): + if self._fp is None: + return True + elif hasattr(self._fp, 'closed'): + return self._fp.closed + elif hasattr(self._fp, 'isclosed'): # Python 2 + return self._fp.isclosed() + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError("The file-like object this HTTPResponse is wrapped " + "around has no file descriptor") + + def flush(self): + if self._fp is not None and hasattr(self._fp, 'flush'): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) diff --git a/resources/scrapers/requests/packages/urllib3/response.pyc b/resources/scrapers/requests/packages/urllib3/response.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25620800cfbdf99f317b8bb132ec073f30c56740 GIT binary patch literal 12852 zcmd5@&vV>Hc5YzEA%_}@6iJc#WiPyITO(T$|e87R^^`mAeCEgsmdky9CFDa#~e1__ZmM)QMFY$nH14% zG`e5Ee*OBr?>#_`|Cyirn}1i^zAAni`1>g?{jVqj{8}njYNx7OYR8gxTgA2-HPp_O zvVw*Rrc^wwMoqQTH22dgo>8M&wKJirTqiT4zwj$pJ5S=!gP{HY%s0t_4)Spm!F4T5M~b}KkrZ^`8;RlCUn4{+)4 zp$H))**i+hrchYH*4a{-Qf^Py>T?t?GQWXKcTnU?y-=!esobXES#PL(N*zv@w@vCr zPsF&@5$R50+;%nz^Ep)d!zj~vKhI9wCh1MHE%0&=M3j0SM|&dV03scYvry}F?@%7~ zQ8AmtjyjBo zJ3h&0F@3)uB~jk*FQBfuG-b7{w&hcNyc)PfjMNY##zRZJu+%HN5*Pc4M(&3YNS?Xu zD|+Ex;Ulg*@kZgrSvl3e-!Ith_g8SMxe8S;oI5NF{|8i{Fo)=JT`D-GwnzX66Az{i z8@&6W4V5}sIoIP!vaP0!svXU#?C+IjS$R`bP(*V$BZ@eyF1>4^^ zdrtx}Vtn3EUnQ3M3Js;YQbApwED^luYpsYbkEY9GCQ2L1@#o?`^I{#k-1oeN;*0xV z^`AU=wB3{K+Den~wH>6kUzi*g2!{F2(4DSbKmx5X*J;m@hS_;NsxODec5?d@Vt;*Vg$6rQn0=W$$=794Zs?<-L-ca@%tm0n+z975ies*-7>#uW6GA+0Jiy+> zCxk0FE+#Vj^jqeE=MP8YTvIPhXGf1iKN?29=o6N757GplN%qMHupxIHA|_ZhdO^lJ zadZ?qw`rqp%Rbx=3_iSlr{Y^5MdNXyK$&;!P*19d6A-S%5Me!-;Ott`ECP`7;(n>1 zwb-5*<%6P~mbr5bUR*pXOeKKU3ud2I130Xq!rzRp^LgK zK4S4Pi|?a=XF!dGPov0-USI>4{tXH|e^tWe7jP=?2@Ely2k6;SR)WXCJc31DOi2ah zv{XFEt*8KNn8jMHiYVCXb*3PL zEs>A-N}hFzQqCTLj=%Y~cf%Fo^R z(CXeGwOJIUcQauIPb_>mnup_@kfmQLOQpZUAfu|ilRVUD2G4Zkk*5B8uwin`GiPGC zQ&G$~O=Ah_c(xOmGjhoY=)lv0=HErVLp7<4adH1Bu1J41efL#)l}PRTFXG0#Xq~Q-L%@g0}^f9i`NqUCP>46e|n342)=NOPljd3FjaxlvA0_{cjM5o-%hmYLNjqQGK z`~LRNdYe7bO*u2bitaUtT>z~p@P*NEzFv_b$pFrT3? zdW?Hbi>VO#P1(!!nWMdwGj|UaBa&>fsECN*X70$nB$FgYvU-%C9K9_`=lGs~AQR>A z*y0#ml5@K(-eti=!UYtRdlP*91ui3;M$4LkVXE|qMoEN2GjD`r)I$FU8mbffc#lDV zz>{P$+5`LnvK0>lY!b(WZ}4jJ{1^tw0rnnxS=af(J8^<&IK(qTq>3JKjyFmtKtCV^ zOHZ-FY|vPN*xm`ic$goo4+f{PSC`(**a?}tBIjXB0h9(ulDe?b3A_7uLEa?d!r)GA zM9fzG4i(!sfj^UuYWh5;OwSND$d;w>CT7bR=$C*8$NiO3F9nRzlQh)P ztje~OfoDi_($#D!CZ49~WM~c=>gz2*M>qkd|4=B;sF$|1!+s!^HIGhM>A_6AoL0~O z**b{?Y?){OD8punuE<1F0ZyP>a-U}9r65HR!c*Wg%#98NYE$Z{p|bxXUTpJ^%y!r& z39BHW)RW||kv*GNOr0$wb7m13qUQqHL7@Jsp?+nlBt)l0>Ev40%NbZaFac~h!}*SY z{?@HuAqNRN_r~GxWB8H`KQ_aGB@zE)_$o=*G6!;Qn0e}OMZs``X;4PaZ$+JS6k+l| z5k^AvRpoHC=!NxS<|oNVm}O1n*VN&4Vp=ZgKa1&ZFw20Qd2PCBm3?TFI7&mjtblla zlcJ(LF%%*dv<(IhZ?S#thh|y;_3RV7z~pbqwlNoc**svu_Gj&C$K%3V+%Dd3x-OCjNm5$ivFwfN9zk#8tyGL=6L23|M={ zz=-jR__AV<)b>K(L%fAR&I!^`C%1EF?E34_luT4ny+rUu$j!-%h?`SMgkOc%XgM?Q?ZWQXv3L=IpJ(KZ#D5zf+IwoE z*vghmK&~l!W)8W|7BT~A`9HtKMetEz_~Z5QQ;hM7TuXc0bDHod; zOSjGfkrIEff7mAooS^h1ojAuH<89D`){rr%RFzTUzQGYi$pqd5X&R6}BQ9@4WK&;EcJC%QKQ2l@}CE}-0`bKw78DVs0?u1w0GTVDgaG!(s<$=B#UW~olq z{W3>~)M}ZyW15vm)|_95I5UL@xDTt1RH(^^BK$f+QZ0{aOI@B~gL+{GU|vHUa5;aH z|07YHpCWOBJf5Mz$ts3UJ%@2J`gPvi{{Q{gHs&tUkz6X1y2g|`lQGV0H9xJQI6^VY zlE;Kq6VqXi`3Q);7#SnGZj34osdzJg0#_fOoFT^~ZHz=R)1?z+nV32*0k@=MyL7)H zOrps^Gc|kygDzQK;xhstPkDuWm<2-33PE(=9z)s*j zON#U1#px;3AwYRBIF~2=1Z$`xS;@3U*dyis9t&~DRJBvdSZ0ajTNan@M>4=jH&#!<~H0y1{<*!A7;KBDkalDIyRX$(m#?8Pld6Iqw~xd(N6aZ6`2OB zf}qq~3qEV5u>^0|EONO`_%EMpDX$IG_3KFz^9hzL`~qeXTo*ilhpXg~R+e~O?lmu2 z4>z3tR$Q(*XE?fLUXY_|aAz!?ShW>AC|@vn0Pz=Rk7_{_wRO$uZK-AC78#UyTjLyg>b3G0hfpLy4cNe8gztN$SFDqn7To45h8bPOEb58#!KK09KHxJVJ1Q_=(yv_9UEcPL`4~dCaHdm!Nh~Sy(h2G zi;oj>d?j(#`QYBbVtme!AsrhazO5$;LVQLTjp3QhTNcrM*~>?m!tCWQQM-sofqead z+c<}cl4$15Tll+pTyJ4ZWnFGz(P9omx7;)A6!uK^iN1@HU4J?MMltoct&7K0A zz|-Nx;TPF$-r{5mO67-hAM*6}(1cFavk$7;sm&M2WxkAj7u4O)QPfTnBb3@J68WR? z#c`3d;EN)Ql05y4B9jAxP<;tu{-VWflchRx%5QO5bd=)k`~4vG@u}oPw*H7kZPxi- z-2E|&Pf^IWlzBCYeB1|oR;PLXl)b1_g4#_8?*4*(h*{h}V?k$TTm{dv95wgPS@TfT z@|4=Q{awI2V2Kt$z6)qxYuat=Dsv^)(p#_8XrA=fH$u$*L|_JLUiv( g=HopYI)%65__PVoei7Pz3m*ipT8mSwH(E3Q2jIA?wg3PC literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/response.pyo b/resources/scrapers/requests/packages/urllib3/response.pyo new file mode 100644 index 0000000000000000000000000000000000000000..25620800cfbdf99f317b8bb132ec073f30c56740 GIT binary patch literal 12852 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/__init__.py b/resources/scrapers/requests/packages/urllib3/util/__init__.py new file mode 100644 index 0000000..8becc81 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/util/__init__.py @@ -0,0 +1,24 @@ +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) diff --git a/resources/scrapers/requests/packages/urllib3/util/__init__.pyc b/resources/scrapers/requests/packages/urllib3/util/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7953eee438150a5bb42fd576ddb71e7f32f562ce GIT binary patch literal 857 zcmYk3OK#gR5Qay7#IM+~H=<@ehTPehF9rmw-$lVci4U1J?)H z?{pvR0NfDdu+syuC*VdPN8rXF$KWO)C*YYzg%Ooh0jbkNb;qgDkMgZ>e5{VE%yRYy9P!0?RntRF*OtLTddjVZqcWXPfk zL072IINct7Lkr(v2Rx(>p)owA1Ku#EaL}mkeMDqK>O4fPnqYB8D%RF8XrOAJ^lh-$ z=^I+KSA4NbPzu_^h`Z4dMQbTfr(4y&idwXQd?=F(o+em{mWXW=?33UH=<@ehTPehF9rmw-$lVci4U1J?)H z?{pvR0NfDdu+syuC*VdPN8rXF$KWO)C*YYzg%Ooh0jbkNb;qgDkMgZ>e5{VE%yRYy9P!0?RntRF*OtLTddjVZqcWXPfk zL072IINct7Lkr(v2Rx(>p)owA1Ku#EaL}mkeMDqK>O4fPnqYB8D%RF8XrOAJ^lh-$ z=^I+KSA4NbPzu_^h`Z4dMQbTfr(4y&idwXQd?=F(o+em{mWXW=?33Uyjx1M^>r4Q0;k9~kXLh}IaH$&M@fTHIR+~xkv&d$uv_i;;arfWa_Nn1S{ zKNI+VgJOS072s7A5$zHUuSwUVNYTKfU5^GO+AWdVj@PJc%5+qtY(PpWGr_aNDIZtLF3Wp`uc;7hT;kCTN9a{>v5mm>Xm0v4)MrnI(Nc z$#fd|uAgKBtE2G9=;btBi}%CW+=6Ma=2;j;+K-<3L#s2fU3a_p{m7bbSGz=ZkBk#P zPF3jx*dD#(S7v&{UKGar+GT!hVZVu8G}PEx=XO!lNXFQtcZBmQo{&EqjSHw9r`Nu5 zzH=GQmPl-nB^ya>q`@(5Vv3rQfRblWXPhiBS(apO3e%a{53Ms<^DG_vVPxV&j!HD~ zi8MfV!QY>3{0}Cnx=iqLk>2Rq{=s$;^=qoUd+Raa#$UPV<EYAs&oR(K7;vY6Q9v{M zO-8YmpixF41)X(~!VI&^26~(h+IY>{o#0WIB8XPo>AsQnMkkAV_Y@DcF5D1S!!#L;M22|bwBGx@MacJV6 z(fvFY7Fg8!Kh-sSedkM;r+`+s+c-$9yCuL$k=Hl7-JAcvpVp7S4+25hlBCQxek2MO zTsSaE?iREVi$P8nz_(*$kLNWQ>McjY*g7AEi;g`5EE^4cngMh((vwqWgF_GcI!0*D zHUhQSJOxpifSIPyu^%OSexw7__wxvxQdp&7g(xgS32NLM>Lm`=QWuOcmL3at#TaPM znJ#7Dg#uiivt!}C;aKSOAh(X$)z?K>lfEwEswJkPiz(_Yr{UFJ2x|5%Ru!7{STi(9 z3`GyUT1^lj}-6j|A3v&Dgf_0k(VS1cAfw4Wj6mn&5<91$E_E@QrfsC0@X?G*W8 z-Blj{c75~S@_J`=?f&xP^{vjr?rtic2$ z^W%_7dwg_mhV=;%o}Sfsh+%VP5krn+DEo2vgq^|e@&)jOrTxB8J$vJZsSy*>EOCir zi+X+xhW7_XWUYVB^_};Q+&^G@Gvhn+7Qx@F5|aPpw2~W#;6`o| z#hrq00s@-{1J1fNzD_jxCepmf)fKJ;Z#THbde5De)_ZbUU`M|iBtagTuh}R2A*wo( U=NeLmljsV*Go|Y16*c?CzlMuMBLDyZ literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/connection.pyo b/resources/scrapers/requests/packages/urllib3/util/connection.pyo new file mode 100644 index 0000000000000000000000000000000000000000..6bb6a360de84979f7eafc6776fa32d9ba15731de GIT binary patch literal 3213 zcmd5;&2HO95T2!E*-~UXO=6@?i*#!gh~lP3klc)-sAD^A5Z4YQ2Q~}^5-qN5+7wB1 zmq~yjx1M^>r4Q0;k9~kXLh}IaH$&M@fTHIR+~xkv&d$uv_i;;arfWa_Nn1S{ zKNI+VgJOS072s7A5$zHUuSwUVNYTKfU5^GO+AWdVj@PJc%5+qtY(PpWGr_aNDIZtLF3Wp`uc;7hT;kCTN9a{>v5mm>Xm0v4)MrnI(Nc z$#fd|uAgKBtE2G9=;btBi}%CW+=6Ma=2;j;+K-<3L#s2fU3a_p{m7bbSGz=ZkBk#P zPF3jx*dD#(S7v&{UKGar+GT!hVZVu8G}PEx=XO!lNXFQtcZBmQo{&EqjSHw9r`Nu5 zzH=GQmPl-nB^ya>q`@(5Vv3rQfRblWXPhiBS(apO3e%a{53Ms<^DG_vVPxV&j!HD~ zi8MfV!QY>3{0}Cnx=iqLk>2Rq{=s$;^=qoUd+Raa#$UPV<EYAs&oR(K7;vY6Q9v{M zO-8YmpixF41)X(~!VI&^26~(h+IY>{o#0WIB8XPo>AsQnMkkAV_Y@DcF5D1S!!#L;M22|bwBGx@MacJV6 z(fvFY7Fg8!Kh-sSedkM;r+`+s+c-$9yCuL$k=Hl7-JAcvpVp7S4+25hlBCQxek2MO zTsSaE?iREVi$P8nz_(*$kLNWQ>McjY*g7AEi;g`5EE^4cngMh((vwqWgF_GcI!0*D zHUhQSJOxpifSIPyu^%OSexw7__wxvxQdp&7g(xgS32NLM>Lm`=QWuOcmL3at#TaPM znJ#7Dg#uiivt!}C;aKSOAh(X$)z?K>lfEwEswJkPiz(_Yr{UFJ2x|5%Ru!7{STi(9 z3`GyUT1^lj}-6j|A3v&Dgf_0k(VS1cAfw4Wj6mn&5<91$E_E@QrfsC0@X?G*W8 z-Blj{c75~S@_J`=?f&xP^{vjr?rtic2$ z^W%_7dwg_mhV=;%o}Sfsh+%VP5krn+DEo2vgq^|e@&)jOrTxB8J$vJZsSy*>EOCir zi+X+xhW7_XWUYVB^_};Q+&^G@Gvhn+7Qx@F5|aPpw2~W#;6`o| z#hrq00s@-{1J1fNzD_jxCepmf)fKJ;Z#THbde5De)_ZbUU`M|iBtagTuh}R2A*wo( U=NeLmljsV*Go|Y16*c?CzlMuMBLDyZ literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/request.py b/resources/scrapers/requests/packages/urllib3/util/request.py new file mode 100644 index 0000000..bc64f6b --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/util/request.py @@ -0,0 +1,71 @@ +from base64 import b64encode + +from ..packages.six import b + +ACCEPT_ENCODING = 'gzip,deflate' + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers diff --git a/resources/scrapers/requests/packages/urllib3/util/request.pyc b/resources/scrapers/requests/packages/urllib3/util/request.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f376a6089875a10e0f703817ba3d19fa87d0beb GIT binary patch literal 2280 zcmd5-Pj4GV6o2b=oF*k|R1VzGC?Kst_O^&BLRK3{-3V2nfShoNR&vI>lX#NdnPq0S zNlL?|-1r)NAWnP%4txMU0K7MAXYI5ShhDIDo@d^?_nSBG--Lf}tpEB49Hub)t>XVz zIP4yh48H(!fFgjS0D`OqSqOOxiV%)MT({w<4O!=nZv}qoz>()4bO}=agTHQoGq;9h zvi(S?RA)lAa8>hZb7J2^diqk9y-b|s+=;Y<3_@t*7~-&hA&~&r9e5Rh8G!?uxBy5I^fzgLCz~Qu?3G6LZGrBO02ME0hmj`I}&T9W`$sW zquaU_aA-hCnE0KoLbghi4@mY-E!zh3`+{uyt+H#i>|MP2 zI>X<=R2!F8&axA2*r`y$a3|F%GvdceSjVP z2|GSMG?h3$?lGQamPM&nN~BI|HSj8ZuM*8LmmztYiqegJ2=V*|cgPi+2*%k&>s)Zv zW4W}h$Ix8s42s4#Cd|)g&TwTZ)RsBTqQ&4xjrg~S!!Bf=| z2mX{=5Dlp;N^#3dqhH8OWXspUT{GtBN7vk724F;KgvA|lubX-#)AzFMN>}WHE4-Gi z(ka5<+-a-4a#OAPmC18C`TW7dczbIp787n|I_8y|HYW~sjw)7Av>cjCRw-Tx44<_Z z+GI1=`JhLntBrh#fu~4$Ko-YwbYlcbyftd*gv+b(yPM!~`tM*!CM}=jVx01H`X5P2 z5`9cfXLLSbO833at*qR;05%KM&oa~=FATTi(w zxO(te{BY}&8$bTEP!iFAMT9UbiXMw7N_9TaUIP$a-vGQ}!>zLMhAf^}@Av0rMZind zP(x#<1L)a%NN*|Fb>uaM`DJ6Zqur*;Ej8Asl#k4=ke)l~f8jQ8wiH?WK62g?aeD{( z^LSWN^O2dys!QAcL}{h6j;mC-5P8@Ju=@f~U+@zuWk;9U9S--tKOFDv55If%eE;ha zvS8$246-y6^j!G2#KSi6^vbtf>qVOK_RA*m-6jIwt_FYgrOb5n?9B5Ar_d#0e?~GK zBtKvR*km^=q)K+n@)>tL8EKBo)8reS$pqV~RyHZ~>Qt(j+K-N%HU^uDFbQ@SU71wa z#HNOqgf;8psKV28Y&ABS^^v4ssLC))>WUn?=Xk1OwrhWsC#LQZ&G=&Z`c R4yBFH(9PCns}rsT{{qxabC3W4 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/request.pyo b/resources/scrapers/requests/packages/urllib3/util/request.pyo new file mode 100644 index 0000000000000000000000000000000000000000..9f376a6089875a10e0f703817ba3d19fa87d0beb GIT binary patch literal 2280 zcmd5-Pj4GV6o2b=oF*k|R1VzGC?Kst_O^&BLRK3{-3V2nfShoNR&vI>lX#NdnPq0S zNlL?|-1r)NAWnP%4txMU0K7MAXYI5ShhDIDo@d^?_nSBG--Lf}tpEB49Hub)t>XVz zIP4yh48H(!fFgjS0D`OqSqOOxiV%)MT({w<4O!=nZv}qoz>()4bO}=agTHQoGq;9h zvi(S?RA)lAa8>hZb7J2^diqk9y-b|s+=;Y<3_@t*7~-&hA&~&r9e5Rh8G!?uxBy5I^fzgLCz~Qu?3G6LZGrBO02ME0hmj`I}&T9W`$sW zquaU_aA-hCnE0KoLbghi4@mY-E!zh3`+{uyt+H#i>|MP2 zI>X<=R2!F8&axA2*r`y$a3|F%GvdceSjVP z2|GSMG?h3$?lGQamPM&nN~BI|HSj8ZuM*8LmmztYiqegJ2=V*|cgPi+2*%k&>s)Zv zW4W}h$Ix8s42s4#Cd|)g&TwTZ)RsBTqQ&4xjrg~S!!Bf=| z2mX{=5Dlp;N^#3dqhH8OWXspUT{GtBN7vk724F;KgvA|lubX-#)AzFMN>}WHE4-Gi z(ka5<+-a-4a#OAPmC18C`TW7dczbIp787n|I_8y|HYW~sjw)7Av>cjCRw-Tx44<_Z z+GI1=`JhLntBrh#fu~4$Ko-YwbYlcbyftd*gv+b(yPM!~`tM*!CM}=jVx01H`X5P2 z5`9cfXLLSbO833at*qR;05%KM&oa~=FATTi(w zxO(te{BY}&8$bTEP!iFAMT9UbiXMw7N_9TaUIP$a-vGQ}!>zLMhAf^}@Av0rMZind zP(x#<1L)a%NN*|Fb>uaM`DJ6Zqur*;Ej8Asl#k4=ke)l~f8jQ8wiH?WK62g?aeD{( z^LSWN^O2dys!QAcL}{h6j;mC-5P8@Ju=@f~U+@zuWk;9U9S--tKOFDv55If%eE;ha zvS8$246-y6^j!G2#KSi6^vbtf>qVOK_RA*m-6jIwt_FYgrOb5n?9B5Ar_d#0e?~GK zBtKvR*km^=q)K+n@)>tL8EKBo)8reS$pqV~RyHZ~>Qt(j+K-N%HU^uDFbQ@SU71wa z#HNOqgf;8psKV28Y&ABS^^v4ssLC))>WUn?=Xk1OwrhWsC#LQZ&G=&Z`c R4yBFH(9PCns}rsT{{qxabC3W4 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/response.py b/resources/scrapers/requests/packages/urllib3/util/response.py new file mode 100644 index 0000000..45fff55 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/util/response.py @@ -0,0 +1,22 @@ +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") diff --git a/resources/scrapers/requests/packages/urllib3/util/response.pyc b/resources/scrapers/requests/packages/urllib3/util/response.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba9c75281e7a3f39b08ae99accab8e148682008a GIT binary patch literal 772 zcmd5&&5qMB5FRH5RauHu9sv0m4&=hELWrtxLh51L1%xcE+<4l0 z#WlO*8GHn|0$9Cir!XP`O#$H{2q9VlZ;#Uf&cI~QjQ>tr{7j-zn({@!XOZ$&WuCed zyF&6=?6Gd5{IEybV~|?z>@~J>YaKpzwn6DPS6Gv@QP$2!G*vOw%{m?QA)&M3oqDbJ z_-`S3S*ID*kQN{D;EPso97;wE5{83q@fU$@_s6JZnbtvf*`0>deGcbD!ESoOmm&B- zX?@#{WdbaHi&Sv%TD$%Pmuab#G&9wbFBn|>#L;4=E+U4g=7u?_dDp$rq}93C{M@Nm z-dLrL@oiL{>vy)TuB|~|kq-e|X08H8--jBbignOk>J{*PkCC`U*NxsW)CcG6=85Xb zx>V6|L#(modhn)q K_-s&-M0^LFfX{IN literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/response.pyo b/resources/scrapers/requests/packages/urllib3/util/response.pyo new file mode 100644 index 0000000000000000000000000000000000000000..ba9c75281e7a3f39b08ae99accab8e148682008a GIT binary patch literal 772 zcmd5&&5qMB5FRH5RauHu9sv0m4&=hELWrtxLh51L1%xcE+<4l0 z#WlO*8GHn|0$9Cir!XP`O#$H{2q9VlZ;#Uf&cI~QjQ>tr{7j-zn({@!XOZ$&WuCed zyF&6=?6Gd5{IEybV~|?z>@~J>YaKpzwn6DPS6Gv@QP$2!G*vOw%{m?QA)&M3oqDbJ z_-`S3S*ID*kQN{D;EPso97;wE5{83q@fU$@_s6JZnbtvf*`0>deGcbD!ESoOmm&B- zX?@#{WdbaHi&Sv%TD$%Pmuab#G&9wbFBn|>#L;4=E+U4g=7u?_dDp$rq}93C{M@Nm z-dLrL@oiL{>vy)TuB|~|kq-e|X08H8--jBbignOk>J{*PkCC`U*NxsW)CcG6=85Xb zx>V6|L#(modhn)q K_-s&-M0^LFfX{IN literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/retry.py b/resources/scrapers/requests/packages/urllib3/util/retry.py new file mode 100644 index 0000000..aeaf8a0 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/util/retry.py @@ -0,0 +1,285 @@ +import time +import logging + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, +) +from ..packages import six + + +log = logging.getLogger(__name__) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + indempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + :param iterable status_forcelist: + A set of HTTP status codes that we should force a retry on. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts. urllib3 will sleep for:: + + {backoff factor} * (2 ^ ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.1s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.MAX_BACKOFF`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, _observed_errors=0): + + self.total = total + self.connect = connect + self.read = read + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self._observed_errors = _observed_errors # TODO: use .history instead? + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + _observed_errors=self._observed_errors, + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r" % (retries, new_retries)) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + if self._observed_errors <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (self._observed_errors - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def sleep(self): + """ Sleep between retry attempts using an exponential backoff. + + By default, the backoff factor is 0 and this method will return + immediately. + """ + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def is_forced_retry(self, method, status_code): + """ Is this method/response retryable? (Based on method/codes whitelists) + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return self.status_forcelist and status_code in self.status_forcelist + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + _observed_errors = self._observed_errors + connect = self.connect + read = self.read + redirect = self.redirect + cause = 'unknown' + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + _observed_errors += 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False: + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + _observed_errors += 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + _observed_errors += 1 + cause = ResponseError.GENERIC_ERROR + if response and response.status: + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, + _observed_errors=_observed_errors) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r" % (url, new_retry)) + + return new_retry + + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/resources/scrapers/requests/packages/urllib3/util/retry.pyc b/resources/scrapers/requests/packages/urllib3/util/retry.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73432d2151f03168340e633412ee9cb90927037e GIT binary patch literal 10646 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/retry.pyo b/resources/scrapers/requests/packages/urllib3/util/retry.pyo new file mode 100644 index 0000000000000000000000000000000000000000..73432d2151f03168340e633412ee9cb90927037e GIT binary patch literal 10646 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/ssl_.py b/resources/scrapers/requests/packages/urllib3/util/ssl_.py new file mode 100644 index 0000000..a788b1b --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/util/ssl_.py @@ -0,0 +1,254 @@ +from binascii import hexlify, unhexlify +from hashlib import md5, sha1 + +from ..exceptions import SSLError + + +SSLContext = None +HAS_SNI = False +create_default_context = None + +import errno +import ssl + +try: # Test for SSL features + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + +try: + from ssl import _DEFAULT_CIPHERS +except ImportError: + _DEFAULT_CIPHERS = ( + 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:' + 'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:ECDH+RC4:' + 'DH+RC4:RSA+RC4:!aNULL:!eNULL:!MD5' + ) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 & 3.1 + supports_set_ciphers = sys.version_info >= (2, 7) + + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, location): + self.ca_certs = location + + def set_ciphers(self, cipher_suite): + if not self.supports_set_ciphers: + raise TypeError( + 'Your version of Python does not support setting ' + 'a custom cipher suite. Please upgrade to Python ' + '2.7, 3.2, or later if you need this functionality.' + ) + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None): + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + } + if self.supports_set_ciphers: # Platform-specific: Python 2.7+ + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + else: # Platform-specific: Python 2.6 + return wrap_socket(socket, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + # Maps the length of a digest to a possible hash function producing + # this digest. + hashfunc_map = { + 16: md5, + 20: sha1 + } + + fingerprint = fingerprint.replace(':', '').lower() + digest_length, odd = divmod(len(fingerprint), 2) + + if odd or digest_length not in hashfunc_map: + raise SSLError('Fingerprint is of invalid length.') + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + hashfunc = hashfunc_map[digest_length] + + cert_digest = hashfunc(cert).digest() + + if not cert_digest == fingerprint_bytes: + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(hexlify(fingerprint_bytes), + hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbrevation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=ssl.CERT_REQUIRED, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 + context.set_ciphers(ciphers or _DEFAULT_CIPHERS) + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + context.check_hostname = (context.verify_mode == ssl.CERT_REQUIRED) + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None): + """ + All arguments except for server_hostname and ssl_context have the same + meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. This is not + supported on Python 2.6 as the ssl module does not support it. + """ + context = ssl_context + if context is None: + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs: + try: + context.load_verify_locations(ca_certs) + except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + if certfile: + context.load_cert_chain(certfile, keyfile) + if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI + return context.wrap_socket(sock, server_hostname=server_hostname) + return context.wrap_socket(sock) diff --git a/resources/scrapers/requests/packages/urllib3/util/ssl_.pyc b/resources/scrapers/requests/packages/urllib3/util/ssl_.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a716d5247508b3ab85903520c7438d3cb4c40d3d GIT binary patch literal 9011 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/ssl_.pyo b/resources/scrapers/requests/packages/urllib3/util/ssl_.pyo new file mode 100644 index 0000000000000000000000000000000000000000..a716d5247508b3ab85903520c7438d3cb4c40d3d GIT binary patch literal 9011 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/timeout.py b/resources/scrapers/requests/packages/urllib3/util/timeout.py new file mode 100644 index 0000000..ea7027f --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/util/timeout.py @@ -0,0 +1,240 @@ +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + +def current_time(): + """ + Retrieve the current time. This function is mocked out in unit testing. + """ + return time.time() + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + `_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + `_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If the type is not an integer or a float, or if it + is a numeric value less than zero. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int or float." % (name, value)) + + try: + if value < 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int or float." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/resources/scrapers/requests/packages/urllib3/util/timeout.pyc b/resources/scrapers/requests/packages/urllib3/util/timeout.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8b8a1fb970d05adb1a47ae8551147cd2e4d2a20 GIT binary patch literal 10385 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 ay{PFGi-T9mr$np^;n~K8`NhWK$^Qa_J+cV^ literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/timeout.pyo b/resources/scrapers/requests/packages/urllib3/util/timeout.pyo new file mode 100644 index 0000000000000000000000000000000000000000..b8b8a1fb970d05adb1a47ae8551147cd2e4d2a20 GIT binary patch literal 10385 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 ay{PFGi-T9mr$np^;n~K8`NhWK$^Qa_J+cV^ literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/url.py b/resources/scrapers/requests/packages/urllib3/util/url.py new file mode 100644 index 0000000..b2ec834 --- /dev/null +++ b/resources/scrapers/requests/packages/urllib3/util/url.py @@ -0,0 +1,212 @@ +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. + """ + slots = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx+1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. + if not port.isdigit(): + raise LocationParseError(url) + port = int(port) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + +def get_host(url): + """ + Deprecated. Use :func:`.parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/resources/scrapers/requests/packages/urllib3/util/url.pyc b/resources/scrapers/requests/packages/urllib3/util/url.pyc new file mode 100644 index 0000000000000000000000000000000000000000..797c561dd52ee7d45490391cbde678e1c9ff8e21 GIT binary patch literal 6593 zcmd5>O>-Pa8SdFxtv)PS4mP&IP-zoVS{L#vI0Z>d(T{Zq$#NX@q>;aMpzn)5z8hYx!r@W}5B3~sHHT2beALXiw7F1MI(V~i$ zRJ5$371du<_fdaB8BfxxdRkFE^q8ueAuAt}|zJ}ZfSvM@=EWI7(*1VVJSzgpoZMy?AG({EJuq+0W z8DzGQ%m|%aCPdQ$`aCL4eo!nS*UQ8H(4rlj4#TtCQlg6c;AN6>6B;I-!Ey`Z5>LN3x>v^KMv# zw#dtFQRYVXvRvn8lpBlX$7x@Oseb>?o!k0u@Igc0wIk4x^#(nGKw78h4FO z;yt5_L0B|Iuc9C43Y^}Wq<3sIBhEyRqvw8|tK+dMU-ZK)4_Nf`Lu8zOMyo`eBQdRq za4%o&Evx(rtqb16KAt-F7TQy>xZS$!`Vz+9=-4bN3!|aNfsWH|Qbu%vVqmoRwuYae zq5->AYD>~<&Mar9C6KU_rKTe!ce-PW$63ColQFi=DU>G)V2Ly_)Y3Iyx6Rih zr!nzVo{6(gD)9IyjtG*P0(+uDEQ`ut_RctuB_h#L#UlTO43yGZq%9s*)RC`_s_JM# z9o5tkf)y&4#3&cVK(DGpSFF%Fm&7_HEYNyCl12%g(?&!KH?ojMUrk0Ka=M1!vmvSq z%p!z}**n3Ap03NEWbDFpti)l?_!k)~AUvHBi*}>_DUAZp(?-HHP00QRb}z8c;Bqrd z_f1}Cq6!S4$aF|hTA6mZGl;Eb*kJh8c94}xq=y->3fPtyYjvKLX>=KmH*%OZ4l<3o zD5LKT%v7R_Oo&sMM-RgToo0pZ7;T<}-6A;h;yLuZaH4d}&jX_b2np<1_EbAwxfk3b|4C7>L zA(in&(h@Qg@ZrWOD4?|H`T_b-Y5|(iOS7UXe}H)VkI4$(B=L|Hc2nCCh_ObL zA?o+y92}&_*dn5)9UD4uR~xXG@elxQfjbZQ3P%pZ0@uQ5CVGt7Kj}%N5s{nhIX@9a zXhb@hx&-b^#F_9(hwl@>pM!g%t}MGP>#c9}vTUmp=GQvmCq&O{TibIOFU_o;>oFe# zzD(Npue|xJwE4*(nY{LrTkUQaVb9_+k(w|^Se5vemcx$8r;4`?jKIDl6DD%AOv1d6 zTgbD$XBTi6k2SeeZ5z=Hq|z}v=jz>2_?uk40*h`bB|{N(pMqz@OUDf_+$ z+re1y;a|%o5cY#s6rrw1`<~NVdX^6ntNA{sap_pxg0g?`p!H{8DzF;N^Znilg+!Hti!`qxZ(1eaAM!MNe zK-8KK8h7z7qh~K+4gC%tC@z~GUVaEs;)@7&DB`gUgxCq-?G5h>iNW=lytbil#U_cY zU>?FF-$EisX+evL6JuDs4deqnJpW7qfELVXA`&+rK&J3nJQ>LfUI2#Dhfhmih4W&k zb@zm~EhHBJM&`J^G2_Xo;vICG3q}^~bbDjWoi{Zo>x@7XJm+Sgi2w^m{klg#ln++B*a zSZrl`l;Z%1x>5|g`Gk{Ef30FmV$_@4&mN!N_{I$@pl@`M3E w?XW0v>l}c)blRY5XM2|1%O)G#_>bIe=PKRL@~Epzxwm#i_5?GA5P<4=Kufz literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/packages/urllib3/util/url.pyo b/resources/scrapers/requests/packages/urllib3/util/url.pyo new file mode 100644 index 0000000000000000000000000000000000000000..797c561dd52ee7d45490391cbde678e1c9ff8e21 GIT binary patch literal 6593 zcmd5>O>-Pa8SdFxtv)PS4mP&IP-zoVS{L#vI0Z>d(T{Zq$#NX@q>;aMpzn)5z8hYx!r@W}5B3~sHHT2beALXiw7F1MI(V~i$ zRJ5$371du<_fdaB8BfxxdRkFE^q8ueAuAt}|zJ}ZfSvM@=EWI7(*1VVJSzgpoZMy?AG({EJuq+0W z8DzGQ%m|%aCPdQ$`aCL4eo!nS*UQ8H(4rlj4#TtCQlg6c;AN6>6B;I-!Ey`Z5>LN3x>v^KMv# zw#dtFQRYVXvRvn8lpBlX$7x@Oseb>?o!k0u@Igc0wIk4x^#(nGKw78h4FO z;yt5_L0B|Iuc9C43Y^}Wq<3sIBhEyRqvw8|tK+dMU-ZK)4_Nf`Lu8zOMyo`eBQdRq za4%o&Evx(rtqb16KAt-F7TQy>xZS$!`Vz+9=-4bN3!|aNfsWH|Qbu%vVqmoRwuYae zq5->AYD>~<&Mar9C6KU_rKTe!ce-PW$63ColQFi=DU>G)V2Ly_)Y3Iyx6Rih zr!nzVo{6(gD)9IyjtG*P0(+uDEQ`ut_RctuB_h#L#UlTO43yGZq%9s*)RC`_s_JM# z9o5tkf)y&4#3&cVK(DGpSFF%Fm&7_HEYNyCl12%g(?&!KH?ojMUrk0Ka=M1!vmvSq z%p!z}**n3Ap03NEWbDFpti)l?_!k)~AUvHBi*}>_DUAZp(?-HHP00QRb}z8c;Bqrd z_f1}Cq6!S4$aF|hTA6mZGl;Eb*kJh8c94}xq=y->3fPtyYjvKLX>=KmH*%OZ4l<3o zD5LKT%v7R_Oo&sMM-RgToo0pZ7;T<}-6A;h;yLuZaH4d}&jX_b2np<1_EbAwxfk3b|4C7>L zA(in&(h@Qg@ZrWOD4?|H`T_b-Y5|(iOS7UXe}H)VkI4$(B=L|Hc2nCCh_ObL zA?o+y92}&_*dn5)9UD4uR~xXG@elxQfjbZQ3P%pZ0@uQ5CVGt7Kj}%N5s{nhIX@9a zXhb@hx&-b^#F_9(hwl@>pM!g%t}MGP>#c9}vTUmp=GQvmCq&O{TibIOFU_o;>oFe# zzD(Npue|xJwE4*(nY{LrTkUQaVb9_+k(w|^Se5vemcx$8r;4`?jKIDl6DD%AOv1d6 zTgbD$XBTi6k2SeeZ5z=Hq|z}v=jz>2_?uk40*h`bB|{N(pMqz@OUDf_+$ z+re1y;a|%o5cY#s6rrw1`<~NVdX^6ntNA{sap_pxg0g?`p!H{8DzF;N^Znilg+!Hti!`qxZ(1eaAM!MNe zK-8KK8h7z7qh~K+4gC%tC@z~GUVaEs;)@7&DB`gUgxCq-?G5h>iNW=lytbil#U_cY zU>?FF-$EisX+evL6JuDs4deqnJpW7qfELVXA`&+rK&J3nJQ>LfUI2#Dhfhmih4W&k zb@zm~EhHBJM&`J^G2_Xo;vICG3q}^~bbDjWoi{Zo>x@7XJm+Sgi2w^m{klg#ln++B*a zSZrl`l;Z%1x>5|g`Gk{Ef30FmV$_@4&mN!N_{I$@pl@`M3E w?XW0v>l}c)blRY5XM2|1%O)G#_>bIe=PKRL@~Epzxwm#i_5?GA5P<4=Kufz literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/sessions.py b/resources/scrapers/requests/sessions.py new file mode 100644 index 0000000..4f30696 --- /dev/null +++ b/resources/scrapers/requests/sessions.py @@ -0,0 +1,682 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). + +""" +import os +from collections import Mapping +from datetime import datetime + +from .auth import _basic_auth_str +from .compat import cookielib, OrderedDict, urljoin, urlparse +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from .utils import to_key_val_list, default_headers, to_native_string +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) +from .packages.urllib3._collections import RecentlyUsedContainer +from .structures import CaseInsensitiveDict + +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +REDIRECT_CACHE_SIZE = 1000 + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """ + Determines appropriate setting for a given request, taking into account the + explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. + for (k, v) in request_setting.items(): + if v is None: + del merged_setting[k] + + merged_setting = dict((k, v) for (k, v) in merged_setting.items() if v is not None) + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """ + Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None): + """Receives a Response. Returns a generator of Responses.""" + + i = 0 + hist = [] # keep track of history + + while resp.is_redirect: + prepared_request = req.copy() + + if i > 0: + # Update history and keep track of redirects. + hist.append(resp) + new_hist = list(hist) + resp.history = new_hist + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if i >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects) + + # Release the connection back into the pool. + resp.close() + + url = resp.headers['location'] + method = req.method + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (parsed_rurl.scheme, url) + + # The scheme should be lower case... + parsed = urlparse(url) + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + # Cache the url, unless it redirects to itself. + if resp.is_permanent_redirect and req.url != prepared_request.url: + self.redirect_cache[req.url] = prepared_request.url + + # http://tools.ietf.org/html/rfc7231#section-6.4.4 + if (resp.status_code == codes.see_other and + method != 'HEAD'): + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if resp.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if resp.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + # https://github.com/kennethreitz/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + if 'Content-Length' in prepared_request.headers: + del prepared_request.headers['Content-Length'] + + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + extract_cookies_to_jar(prepared_request._cookies, prepared_request, resp.raw) + prepared_request._cookies.update(self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # Override the original request. + req = prepared_request + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + i += 1 + yield resp + + def rebuild_auth(self, prepared_request, response): + """ + When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers: + # If we get redirected to a new host, we should strip out any + # authentication headers. + original_parsed = urlparse(response.request.url) + redirect_parsed = urlparse(url) + + if (original_parsed.hostname != redirect_parsed.hostname): + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """ + This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + """ + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() if proxies is not None else {} + + if self.trust_env and not should_bypass_proxies(url): + environ_proxies = get_environ_proxies(url) + + proxy = environ_proxies.get(scheme) + + if proxy: + new_proxies.setdefault(scheme, environ_proxies[scheme]) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('http://httpbin.org/get') + 200 + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request `. + self.auth = None + + #: Dictionary mapping protocol to the URL of the proxy (e.g. + #: {'http': 'foo.bar:3128'}) to be used on each + #: :class:`Request `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: SSL certificate default. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Should we trust the environment? + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar `, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount('https://', HTTPAdapter()) + self.mount('http://', HTTPAdapter()) + + # Only store 1000 redirects to prevent using infinite memory + self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request ` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) + + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request(self, method, url, + params=None, + data=None, + headers=None, + cookies=None, + files=None, + auth=None, + timeout=None, + allow_redirects=True, + proxies=None, + hooks=None, + stream=None, + verify=None, + cert=None, + json=None): + """Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary or bytes to send in the body of the + :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a (`connect timeout, read + timeout `_) tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of + the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) if ``True``, the SSL cert will be verified. + A CA_BUNDLE path can also be provided. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + """ + + method = to_native_string(method) + + # Create the Request. + req = Request( + method = method.upper(), + url = url, + headers = headers, + files = files, + data = data or {}, + json = json, + params = params or {}, + auth = auth, + cookies = cookies, + hooks = hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + """Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + """Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + """Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + """Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + """Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + """Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + """Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest.""" + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if not isinstance(request, PreparedRequest): + raise ValueError('You can only send PreparedRequests.') + + checked_urls = set() + while request.url in self.redirect_cache: + checked_urls.add(request.url) + new_url = self.redirect_cache.get(request.url) + if new_url in checked_urls: + break + request.url = new_url + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + timeout = kwargs.get('timeout') + verify = kwargs.get('verify') + cert = kwargs.get('cert') + proxies = kwargs.get('proxies') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = datetime.utcnow() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + r.elapsed = datetime.utcnow() - start + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """Check the environment and merge it with some settings.""" + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + env_proxies = get_environ_proxies(url) or {} + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """Returns the appropriate connnection adapter for the given URL.""" + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by key length.""" + + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + state['redirect_cache'] = dict(self.redirect_cache) + return state + + def __setstate__(self, state): + redirect_cache = state.pop('redirect_cache', {}) + for attr, value in state.items(): + setattr(self, attr, value) + + self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE) + for redirect, to in redirect_cache.items(): + self.redirect_cache[redirect] = to + + +def session(): + """Returns a :class:`Session` for context-management.""" + + return Session() diff --git a/resources/scrapers/requests/sessions.pyc b/resources/scrapers/requests/sessions.pyc new file mode 100644 index 0000000000000000000000000000000000000000..899e786f0f462f9a0ca0b627e5c23a8f71614100 GIT binary patch literal 21450 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 Yxnlolel$0bA3ixeI{uaM@5q<_7eI^2O8@`> literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/sessions.pyo b/resources/scrapers/requests/sessions.pyo new file mode 100644 index 0000000000000000000000000000000000000000..899e786f0f462f9a0ca0b627e5c23a8f71614100 GIT binary patch literal 21450 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 Yxnlolel$0bA3ixeI{uaM@5q<_7eI^2O8@`> literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/status_codes.py b/resources/scrapers/requests/status_codes.py new file mode 100644 index 0000000..e0887f2 --- /dev/null +++ b/resources/scrapers/requests/status_codes.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('already_reported',), + 226: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), +} + +codes = LookupDict(name='status_codes') + +for (code, titles) in list(_codes.items()): + for title in titles: + setattr(codes, title, code) + if not title.startswith('\\'): + setattr(codes, title.upper(), code) diff --git a/resources/scrapers/requests/status_codes.pyc b/resources/scrapers/requests/status_codes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f47c4142c1b57098be5a0cc7d3a3150b589dfded GIT binary patch literal 4641 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/status_codes.pyo b/resources/scrapers/requests/status_codes.pyo new file mode 100644 index 0000000000000000000000000000000000000000..0ff7260a4e68af3e57e67b073bd185b3c6e4fbbf GIT binary patch literal 4686 zcmaJ^39KDe8UF8kw2u~Qt0GbfK}F3A_Ps)BYS=23f(QaSwbnc@4D;qc@4nMFcjk8H z%v*>dF*PwJCMt`dfD17Q?lCcLxBxEf;J$Bl-T{L7jD{O4cJ z9o@fX^}=O0?TDrS=TP7o_+P{$B8q=4NkqCWnQBSPzDo2K(NWo=UlCma_^Rj_;A^6* z0ACk99B`}X5rEr7j|AK=(Tr@Sx}ofQLjs0(e;TM!+MYHv=9O{W#z;(N6&$7yS(2 z3DM62{ww-9z>}h%mn~BxVp^hK5dEU;mDbd#ELt&#h#8UHD?pLGE!lq2PHB(G)JmBe zlf|>ejDfUOrVbUeO3bJjOjgR?QE6eed$s77s8y^VY1q3D<5qp4J?lsCZ`YocBfIp= zvSa)y1eaN#h+UP^JKf@E{< z5D(FkTZu`OBq3-tu$qEiFFIMK#V9!KY@^40*Ii-nz}k&rh;tJ;qxMb`yh=WBxBI??Nm~?cLmgUP!Z$els}nJ*2I{kekA|n(S88 z6nifP)?(;IxwBEyh|t+x|Xr_er~o7 zLzKW7x)kQ7m*sT91LW|#wi}iO2>WW$<}>kZW^u!I0|Lf98|-d2Z#3)~I3dM>lO=yP zPwn5rgq@%;k35r=soF^{S7BKg6J~DK081lWOheJOgbW7MECd84q#Rg+rb3 z(O6OKW-8PF(~&~W$FpM~Vr}1DTU)06*t!&Ey@ym@MK4rE1anlam0VXq~Fm8pkY&JbTr#&9OG2~NyN8m8OpD18*DwJkiDTdJy2 zly{81o)XU+l4xp@XMccf)`>DL%3hT@VHcMfg>I>5d{P|5@?~KlWIxDFjvaghDU?TP z$N1YS;O1h+@+OA8R?AejEhlY1#BF)^X0eBeudb`|g#9pi3;-lIOf^w2b3T0gQx+*3 zMgyk3ff_8%W!kUnG%2hc=8M_^40|KxS)P+Do`XX^$~DubvLIB`Gby4sUh?i3EbUE$ zFJ-wJBml}_lHdrqN+0@V+Gp6CDa)KGd!0N|(*%N#rasYrj8eSB;mdDC?I&u}*o08I zSS5VI7Cr=Ps{JJ8o{w#2Q7KIxq8KGw41&cQ@^qs8G_|T+!@fl?OHun7$Y?Fb-a;-@ zCpQk|3GH;Y-w&{~x03r3aHlIThSL;DHCre`v;#Q5-y?D~Uhmz5sP;DQ!SqG3nMWS@ zYeVq}6VrhHz%0pz-rL%(uy$~(ghe`A=4txYnCmcGB7am&M zN9wKn+F@N*9wp-i_~xv0y%5G0tPV7w$zE^xFxx&xC0_e{l-mf7h>{`;Q`5=Nq8-}b z;}l?OSQLSo85?_d6%HK-732wWS!1T7R2QtGS|zq?U1%0#V-#hH)x2TaCn;a|JhO<0 z17z$|r243dP|Ce?ecwlFDBf7$O8Wx;a4Y&{)4$X_CE%;6ny~{_QjEF5V{Duv0lRX* zoE>N1FRI5@!2JT+7*HqR&Gegj^Q5Y_9C}h!Ut<-ic4k`%c-a+$8Cx+}5sKykRMGr3 z550KCdG3Ib7_ig^yo-Pytu|ZV%y_dE?P$(;*kajdiT~mO&l0cZ$-aSBhOj1kntzQ{ zJHM#;#*3TTah&k>ihCxx+c}(tq59C-oO#_>lW`7**O2Bv zc`lddaY?JZKda(dvCk*_0Zj|$i)~41)jn>6nhFp3lUc#A=_lS&X3{S6|m0(OkucDlJ`wUfP8b+sK z%wkrsXbcy&N_%%BKG%pRm<8R2k#a_D->3?gm$54mqx4hNTsvY8OWpd_+42FUho_R`pC)!NW z-lkofwzu_q+anjXgDk?b(>@Qs8QPI5I$XP#lpUK+&RaFvB#JZJr^(wmNLJ?f8PhJ} zJi=!RkgE3Iu6|opr' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/resources/scrapers/requests/structures.pyc b/resources/scrapers/requests/structures.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a79745e0c181bdacd30ba8f1a76f63babf8fbbeb GIT binary patch literal 6126 zcmd5=U2hx56`ds|T4dw~P1_`bQFPigB^}6YUJ3+`VpNsg)=eS=D08q3x0h+1j6 zyWSZ}72x#6c`N$&`WyP*AJCq2hf7hBk-mkNu)~?1ulsTCnLFG5&+Xnn{-vHIYW~;8 z@9**0M<`OI4p9awZK*s^hp4ob3Djvz9izUczE$d_Qhz;ct8`tNHF?`vyj|zKgTXB> z_XUbxZJy7Jb#`c7JxkoIHn#Won}5CD!`Q|8YLIp(vC~y~VQL*VYxH{AfAP2PeuAa< zVrw23))Y2#*|~X`C2pZo3;lnf3}+||RD$RzTPl5nx_t}9)+i~IIfTe_&;<8N0d5b|DjC8ZvZQwTa9 z-^;TzqsyaHlel3|Mn9fbxtW^6SsmxOo*H*jrl=RGE-O>VE-MSG%VQZl9w%jhK|BUcBr46NW;5U*N}gDWNHid8QFsdfXr;`JhqN2 zHftESE!vI8*tj0ROfD`Gb9X%6p6kf%2W&$`5pJnbUv<(%ev!o>S>Pgr3Q1YGI4is> z7H|>GhWgLY``pyq8YrzVp^^wRpJHVZ2l%ohv$BL<^5*^f-cs~+lBN0+{R&VH?#eRr zF;DxuNn$G3e}>V0_$$v6@$7F;ZCUiM4~_Ts9)0nILtiyk>-Y4NdgkrS<@3zC0pz&L z@k<*u<7DwamNlFi6Kk~UiHTGA>uH}l1AF&Ok(4R)?LPyI#DKLy*cJCw71VN($k^z5AmtE&M&&O{ZBg+N~<`?kFr{G$*4^;rdaWrZDrU%4cxJ zkPJ}{;fosRF!cz|EoXIN?8qi{3|_K$2f(rr-mC@V4-MIWGU`9cMo`0oZu zV>ABlvG?aFyg`mzVjpRq20U(dmh3}=hb-JW3hys260+%712IUSAa#WXcmuLTku{F2 z6h$ARX(_mB3u;*9BijEA6@p?(=`Ea8TL%LU+0Td#sfy}hchRKQVUJBbEAq5gbkZow z2=IyqHx>OUI=`dnC$IAEYpG&tKrr;>M@uTwHGCGnd&e{zP*i3usab9W}-*g zy)S+h^2tphA^KXV#XLNUAW{@P_&%-vA7bqgvp-|TN)s^zkd|%hqnSgB;7%l86(%Ma zeQLG9_!>9n^F9h<{LVFu;{XK0x4`)x?M;vf zzjTW$l1W3cJKncJ6e7%}#f{+n)b#bi3WQDE(Pk zp3SOPe|BMdWR^d>;3LcTe0D)EJ}lv*%q@OHA+1{)hHK;VMqFR&TsCXIm)xW&jp5)M zAT1KeIk`fBtZ>VE3D4n(X<$e2%1wz56mGUNTw}uD;C)DMUGYiSXA{qA@@kRhDR%e# z%v)0vWeWl!o5QpWF{R#~=a-gH+nL*}|Gw=%@KGh|aETS4L4tEQs)?(c{$zxBosee1 zvG5<9*|?B_HIG7Gk`Z=%gZqbs+>-xRdoPlRKU%2SzIo^Uu9`@Omeiz^!@Dd#Kp~00 zI8Ls6!Zi365zlhBLWokb37!Q*GJ?YQSp1p=lfES)B*A$i6qV3gWqdK@zs6&UlTOfS zZLWdl)`fw*)T literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/structures.pyo b/resources/scrapers/requests/structures.pyo new file mode 100644 index 0000000000000000000000000000000000000000..a79745e0c181bdacd30ba8f1a76f63babf8fbbeb GIT binary patch literal 6126 zcmd5=U2hx56`ds|T4dw~P1_`bQFPigB^}6YUJ3+`VpNsg)=eS=D08q3x0h+1j6 zyWSZ}72x#6c`N$&`WyP*AJCq2hf7hBk-mkNu)~?1ulsTCnLFG5&+Xnn{-vHIYW~;8 z@9**0M<`OI4p9awZK*s^hp4ob3Djvz9izUczE$d_Qhz;ct8`tNHF?`vyj|zKgTXB> z_XUbxZJy7Jb#`c7JxkoIHn#Won}5CD!`Q|8YLIp(vC~y~VQL*VYxH{AfAP2PeuAa< zVrw23))Y2#*|~X`C2pZo3;lnf3}+||RD$RzTPl5nx_t}9)+i~IIfTe_&;<8N0d5b|DjC8ZvZQwTa9 z-^;TzqsyaHlel3|Mn9fbxtW^6SsmxOo*H*jrl=RGE-O>VE-MSG%VQZl9w%jhK|BUcBr46NW;5U*N}gDWNHid8QFsdfXr;`JhqN2 zHftESE!vI8*tj0ROfD`Gb9X%6p6kf%2W&$`5pJnbUv<(%ev!o>S>Pgr3Q1YGI4is> z7H|>GhWgLY``pyq8YrzVp^^wRpJHVZ2l%ohv$BL<^5*^f-cs~+lBN0+{R&VH?#eRr zF;DxuNn$G3e}>V0_$$v6@$7F;ZCUiM4~_Ts9)0nILtiyk>-Y4NdgkrS<@3zC0pz&L z@k<*u<7DwamNlFi6Kk~UiHTGA>uH}l1AF&Ok(4R)?LPyI#DKLy*cJCw71VN($k^z5AmtE&M&&O{ZBg+N~<`?kFr{G$*4^;rdaWrZDrU%4cxJ zkPJ}{;fosRF!cz|EoXIN?8qi{3|_K$2f(rr-mC@V4-MIWGU`9cMo`0oZu zV>ABlvG?aFyg`mzVjpRq20U(dmh3}=hb-JW3hys260+%712IUSAa#WXcmuLTku{F2 z6h$ARX(_mB3u;*9BijEA6@p?(=`Ea8TL%LU+0Td#sfy}hchRKQVUJBbEAq5gbkZow z2=IyqHx>OUI=`dnC$IAEYpG&tKrr;>M@uTwHGCGnd&e{zP*i3usab9W}-*g zy)S+h^2tphA^KXV#XLNUAW{@P_&%-vA7bqgvp-|TN)s^zkd|%hqnSgB;7%l86(%Ma zeQLG9_!>9n^F9h<{LVFu;{XK0x4`)x?M;vf zzjTW$l1W3cJKncJ6e7%}#f{+n)b#bi3WQDE(Pk zp3SOPe|BMdWR^d>;3LcTe0D)EJ}lv*%q@OHA+1{)hHK;VMqFR&TsCXIm)xW&jp5)M zAT1KeIk`fBtZ>VE3D4n(X<$e2%1wz56mGUNTw}uD;C)DMUGYiSXA{qA@@kRhDR%e# z%v)0vWeWl!o5QpWF{R#~=a-gH+nL*}|Gw=%@KGh|aETS4L4tEQs)?(c{$zxBosee1 zvG5<9*|?B_HIG7Gk`Z=%gZqbs+>-xRdoPlRKU%2SzIo^Uu9`@Omeiz^!@Dd#Kp~00 zI8Ls6!Zi365zlhBLWokb37!Q*GJ?YQSp1p=lfES)B*A$i6qV3gWqdK@zs6&UlTOfS zZLWdl)`fw*)T literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/utils.py b/resources/scrapers/requests/utils.py new file mode 100644 index 0000000..aa5c140 --- /dev/null +++ b/resources/scrapers/requests/utils.py @@ -0,0 +1,697 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. + +""" + +import cgi +import codecs +import collections +import io +import os +import platform +import re +import sys +import socket +import struct +import warnings + +from . import __version__ +from . import certs +from .compat import parse_http_list as _parse_list_header +from .compat import (quote, urlparse, bytes, str, OrderedDict, unquote, is_py2, + builtin_str, getproxies, proxy_bypass, urlunparse) +from .cookies import RequestsCookieJar, cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import InvalidURL + +_hush_pyflakes = (RequestsCookieJar,) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + if hasattr(o, '__len__'): + return len(o) + + if hasattr(o, 'len'): + return o.len + + if hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + return os.fstat(fileno).st_size + + if hasattr(o, 'getvalue'): + # e.g. BytesIO, cStringIO.StringIO + return len(o.getvalue()) + + +def get_netrc_auth(url): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{0}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See http://bugs.python.org/issue20164 & + # https://github.com/kennethreitz/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc + host = ri.netloc.split(':')[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth + pass + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if name and name[0] != '<' and name[-1] != '>': + return os.path.basename(name) + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: need more than 1 value to unpack + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, collections.Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + """ + + cj2 = cookiejar_from_dict(cookie_dict) + cj.update(cj2) + return cj + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = cgi.parse_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + """ + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, unreserved, + # or '%') + return quote(unquote_unreserved(uri), safe="!#$%&'()*+,/:;=?@[]~") + + +def address_in_network(ip, net): + """ + This function allows you to check if on IP belongs to a network subnet + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """ + Converts mask from /xx format to xxx.xxx.xxx.xxx + Example: if mask is 24 function returns 255.255.255.0 + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """Very simple check of the cidr format in no_proxy variable""" + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +def should_bypass_proxies(url): + """ + Returns whether we should bypass proxies or not. + """ + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy = get_proxy('no_proxy') + netloc = urlparse(url).netloc + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the netloc, both with and without the port. + no_proxy = no_proxy.replace(' ', '').split(',') + + ip = netloc.split(':')[0] + if is_ipv4_address(ip): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(ip, proxy_ip): + return True + else: + for host in no_proxy: + if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + # If the system proxy settings indicate that this URL should be bypassed, + # don't proxy. + # The proxy_bypass function is incredibly buggy on OS X in early versions + # of Python 2.6, so allow this call to fail. Only catch the specific + # exceptions we've seen, though: this call failing in other ways can reveal + # legitimate problems. + try: + bypass = proxy_bypass(netloc) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + +def get_environ_proxies(url): + """Return a dict of environment proxies.""" + if should_bypass_proxies(url): + return {} + else: + return getproxies() + + +def default_user_agent(name="python-requests"): + """Return a string representing the default user agent.""" + _implementation = platform.python_implementation() + + if _implementation == 'CPython': + _implementation_version = platform.python_version() + elif _implementation == 'PyPy': + _implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel]) + elif _implementation == 'Jython': + _implementation_version = platform.python_version() # Complete Guess + elif _implementation == 'IronPython': + _implementation_version = platform.python_version() # Complete Guess + else: + _implementation_version = 'Unknown' + + try: + p_system = platform.system() + p_release = platform.release() + except IOError: + p_system = 'Unknown' + p_release = 'Unknown' + + return " ".join(['%s/%s' % (name, __version__), + '%s/%s' % (_implementation, _implementation_version), + '%s/%s' % (p_system, p_release)]) + + +def default_headers(): + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a dict of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + """ + + links = [] + + replace_chars = " '\"" + + for val in re.split(", *<", value): + try: + url, params = val.split(";", 1) + except ValueError: + url, params = val, '' + + link = {} + + link["url"] = url.strip("<> '\"") + + for param in params.split(";"): + try: + key, value = param.split("=") + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + '''Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument.''' + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password.""" + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +def to_native_string(string, encoding='ascii'): + """ + Given a string object, regardless of type, returns a representation of that + string in the native string type, encoding and decoding where necessary. + This assumes ASCII unless told otherwise. + """ + out = None + + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) diff --git a/resources/scrapers/requests/utils.pyc b/resources/scrapers/requests/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..314e326f9f3ae2aed01b1f33afae635da4b8a069 GIT binary patch literal 22082 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/requests/utils.pyo b/resources/scrapers/requests/utils.pyo new file mode 100644 index 0000000000000000000000000000000000000000..314e326f9f3ae2aed01b1f33afae635da4b8a069 GIT binary patch literal 22082 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 literal 0 HcmV?d00001 diff --git a/resources/scrapers/scrapers.py b/resources/scrapers/scrapers.py new file mode 100644 index 0000000..39a036b --- /dev/null +++ b/resources/scrapers/scrapers.py @@ -0,0 +1,128 @@ +# !/usr/bin/python +# -*- coding: utf-8 -*- + +import re +#import xbmc, xbmcgui, xbmcplugin, xbmcvfs +import xbmcaddon +from tvdb import TvDb +from tmdbs import TmDb +from kinopoisks import KinoPoisk + + +STATUS = { + 'moder': (40501, 'FFFF0000'), + 'check': (40502, 'FFFF0000'), + 'repeat': (40503, 'FFFF0000'), + 'nodesc': (40504, 'FFFF0000'), + 'copyright': (40505, 'FFFF0000'), + 'close': (40506, 'FFFF0000'), + 'absorb': (40507, 'FFFF0000'), + + 'nocheck': (40508, 'FFFF9900'), + 'neededit': (40509, 'FFFF9900'), + 'doubtful': (40510, 'FFFF9900'), + 'temp': (40511, 'FFFF9900'), + + 'ok': (40512, 'FF339933') +} + +GENRE = ( + ('anime', 80102), + ('biography', 80103), + ('action', 80104), + ('western', 80105), + ('military', 80106), + ('detective', 80107), + ('children', 80108), + ('documentary', 80109), + ('drama', 80110), + ('game', 80111), + ('history', 80112), + ('comedy', 80113), + ('concert', 80114), + ('short', 80115), + ('criminal', 80116), + ('romance', 80117), + ('music', 80118), + ('cartoon', 80119), + ('musical', 80120), + ('news', 80121), + ('adventures', 80122), + ('realitytv', 80123), + ('family', 80124), + ('sports', 80125), + ('talkshows', 80126), + ('thriller', 80127), + ('horror', 80128), + ('fiction', 80129), + ('filmnoir', 80130), + ('fantasy', 80131) +) + +WORK = ( + ('actor', u'Актер'), + ('director', u'Режиссер'), + ('writer', u'Сценарист'), + ('producer', u'Продюсер'), + ('composer', u'Композитор'), + ('operator', u'Оператор'), + ('editor', u'Монтажер'), + ('design', u'Художник'), + ('voice', u'Актер дубляжа'), + ('voice_director', u'Режиссер дубляжа') +) + +MPAA = ('G', 'PG', 'PG-13', 'R', 'NC-17', 'C', 'GP') + + +class Scrapers(): + RE = { + 'year': re.compile(r'\(([1-2]{1}[0-9]{3})\)', re.U), + 'second': re.compile(r'^([^\[]*)\[(.+)\]([^\]]*)$', re.U) + } + + def scraper(self, content, item, language='en'): + # если есть специализированный скрабер, то запускаем его... + + scraped_item = self.scraper_default(item) + + if content == 'tvdb': + scraper = TvDb(language) + elif content == 'tmdb': + scraper = TmDb(language) + else: #if content == 'kinopoisk': + scraper = KinoPoisk(language) + + name, search, year = item['label'], item['search'], item['year'] + + if not search: + return scraped_item + + scraper_item = scraper.scraper(search, year) + if not scraper_item: + scraped_item['label'] = name + return scraped_item + + scraped_item.update(scraper_item) + scraped_item['label'] = name + + return scraped_item + + def default(self, item): + scraper = self.scraper_default(item) + name, search, year = item['label'], item['search'], item['year'] + scraper['label'] = name + + item.update(scraper) + return item + + def scraper_default(self, item): + return { + 'label': item['label'], + 'icon': None, + 'thumbnail': None, + 'info': {}, + 'properties': { + 'fanart_image': None + }, + } diff --git a/resources/scrapers/scrapers.pyo b/resources/scrapers/scrapers.pyo new file mode 100644 index 0000000000000000000000000000000000000000..27639f330fbbd3551571e44305e4ab311d43b200 GIT binary patch literal 4717 zcmcgw`*R#e5$?S`ogS9431DzSC9X<}oK4wfM<82{;mL-#A-6HW?bW6nR(7m7dmFPY|{3>*3h&P}+ zOZ+-?=ZLRIw@mzcbmxh0qTz`?;tvwvPy7J!hloE+{1M`h5`T>NoOadITl*_?j!MVR+NbO@jA_~bnRQNk+K!=e)y%&K5c?-W=8 zOjTX^x!zUa7}i;!M+D34K~i5x^~`LpceiH7lF7L=}_l>x}bki%)%;H7&Wi- zFAJk!R)?IbSpP~SYcPzHpb@FqjQq6-C8nJEk*|LvQ2d|q;oNTp$;z`j%M+~gI}wO$ zK@urm(7!JXf+P-9n(IG^K&H!P6TlY*il;%UBOUvp{$nvBO(Gv-^q-0mQ6tlV{&S%Z z{4`In`@a+dqsI(?6@j=It5cc&o1g(8pXafqMyfLXcah19PZjL*g?wKBLqy{Ew2z=I z=zkVCtHaMs|En01`{5jX$ISm0k@%j^raBCfe=ik-u(vcxHI2YR!ZWSyn{q@TL#A~Y z#feUJscqsT-r0h7MIZsf%T3aTc;0-t`RvNM=2I(Y%vjbbULkbrMfX_qspiwoXI9Rx zoHZ7*hf}FW9yG2K{iT)rVex$P^2!-wb|dyE;qm5{L#uou)UnW0$O7?*^Z4= z?A5VZJxnUks5x;*Ml%Wdkm29F)sx?`uo2aMV15fi-e0OwGpS^IjBWP1yK z*}KswTnrBB5~&iMbmdl%hcYdfr1TB9q*iUEE{b*!ahbS>&f_Yn5LcvN;*!AaAP;@y zjaTKZWE;@bs@3B=w%&H)^p2(D+qaIKI6btqxwhG){DSh+?0VSTTRnbn?f8i;n`_6b z+updjc0%w8;9E@8Glc`mW>YE-#D7UN=?~zSJ%?tI=p@<_EjzSSrbS$E4$YM)-9iY- zqHE+m6yIu8C8Ih>n6jf9q}=U5OojV!qjY84_0UGQv{a#`URvs-#a_xz(_)#%7keaN zz>9qnwxxbr?5FG!EmlO0N%k14GM(%Z4IFf?R8=Lj#%!IP=PCOT;X&SV=ufGz6$L*H zX1#q7ni2UrJZ1LnPO_Tz8)5E2M4rhBsm}J zj$>p}C-mc)hCie7LD<`Acv7_9-Nghk3afVr$oSP|m>R<>G-R6Wy?8pXyLJqxG^_1r z)X&=fdi^dx_iJ8)G8WI&4kxT@K64UhwR+f?(ebu<%_`Z3Gl`OqDp5m0Od4sRvRZ3f zori7p1>@IIER=0RL+-lLptH`wuQXWNRH``T(sfS789=|*87Ku3B8h!Flimi<$|T2R z4D!Qd(nje@$OCl93gm$+X|{wnikvZLWe;>Gk!mId9f0ww%sb{CMB52bRTlL|rFknF z^Cmr6*L%A(5?JpZY1%=(#xXSM&`PHSj%1Q7gfMPG$ksY0XtIZP&~5|J2!sukR1HR< zEZGj#LIai2L64^%$SX8FUX`212FE6yWT4z~`D`PaihUhgaXg)vteW;?T%nUXl6(}G za4DdySOq2QWGlJ-v(!+J9tBX zpNYF6yq*h{g~D;Wpm5wSC=|B~3d8M!!fv~uu-h&uT~LUu zx4sx_F3%2qHS=Zis;=a)RxahDi^v+G_ZkQdjkQp2J;Pxwe62v?uXYA`|5uP$D}Fg9 zYc+BUbm**|^9Gqy_^dTqO=_)FeC=YkcI1sRQh2R}!aNMGwQ!R_A+>e}nYWwSTB$hH zp|^J6%`#BPt%bJ;6l!ZnNUdn|TWj$Ku@Gu&;jIFN*4hE$dKb5~Hk-vpsI7%t1PZOS zLnN+OaNEvIT?E$--6}(c-dea#pm19|M0SmG(Qy|~s&|R{syx@)jfma< zKyS@;;O&OBcRQL6!S(hO(C}OD4l&t_#?-v(T7mel4f_|;eN$0j_=6|J(2yZRqH?gQ z%+MlJap&;&d0qZK&pfHPh8c|?-GB7hxUn8RhP;*2~v*TQ`ioXL?ITKTvj2pZ~va|I3W+cPs9H0EXDBPyhe` literal 0 HcmV?d00001 diff --git a/resources/scrapers/tmdb.py b/resources/scrapers/tmdb.py new file mode 100644 index 0000000..d381121 --- /dev/null +++ b/resources/scrapers/tmdb.py @@ -0,0 +1,472 @@ +# !/usr/bin/env python +#-*- coding:utf-8 -*- +#author:doganaydin +#project:themoviedb +#repository:http://github.com/doganaydin/themoviedb +#license: LGPLv3 http://www.gnu.org/licenses/lgpl.html +"""An interface to the themoviedb.org API""" + +__author__ = "doganaydin" +__version__ = "1.0b" +import os + +os.sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)))) +try: + import simplejson +except: + import json as simplejson + +import fuzzywuzzy.fuzz +import requests + +config = {} + + +def configure(api_key, language='en'): + config['apikey'] = api_key + config['language'] = language + config['urls'] = {} + config['urls'][ + 'movie.search'] = "https://api.themoviedb.org/3/search/movie?query=%%s&year=%%s&api_key=%(apikey)s&page=%%s" % ( + config) + config['urls']['movie.info'] = "https://api.themoviedb.org/3/movie/%%s?api_key=%(apikey)s" % (config) + config['urls'][ + 'people.search'] = "https://api.themoviedb.org/3/search/person?query=%%s&api_key=%(apikey)s&page=%%s" % (config) + config['urls']['collection.info'] = "https://api.themoviedb.org/3/collection/%%s&api_key=%(apikey)s" % (config) + config['urls'][ + 'movie.alternativetitles'] = "https://api.themoviedb.org/3/movie/%%s/alternative_titles?api_key=%(apikey)s" % ( + config) + config['urls']['movie.casts'] = "https://api.themoviedb.org/3/movie/%%s/casts?api_key=%(apikey)s" % (config) + config['urls']['movie.images'] = "https://api.themoviedb.org/3/movie/%%s/images?api_key=%(apikey)s" % (config) + config['urls']['movie.keywords'] = "https://api.themoviedb.org/3/movie/%%s/keywords?api_key=%(apikey)s" % (config) + config['urls']['movie.releases'] = "https://api.themoviedb.org/3/movie/%%s/releases?api_key=%(apikey)s" % (config) + config['urls']['movie.trailers'] = "https://api.themoviedb.org/3/movie/%%s/trailers?api_key=%(apikey)s" % (config) + config['urls']['movie.translations'] = "https://api.themoviedb.org/3/movie/%%s/translations?api_key=%(apikey)s" % ( + config) + config['urls'][ + 'person.info'] = "https://api.themoviedb.org/3/person/%%s?api_key=%(apikey)s&append_to_response=images,credits" % ( + config) + config['urls']['latestmovie'] = "https://api.themoviedb.org/3/latest/movie?api_key=%(apikey)s" % (config) + config['urls']['config'] = "https://api.themoviedb.org/3/configuration?api_key=%(apikey)s" % (config) + config['urls']['request.token'] = "https://api.themoviedb.org/3/authentication/token/new?api_key=%(apikey)s" % ( + config) + config['urls'][ + 'session.id'] = "https://api.themoviedb.org/3/authentication/session/new?api_key=%(apikey)s&request_token=%%s" % ( + config) + config['urls'][ + 'movie.add.rating'] = "https://api.themoviedb.org/3/movie/%%s/rating?session_id=%%s&api_key=%(apikey)s" % ( + config) + config['api'] = {} + config['api']['backdrop.sizes'] = "" + config['api']['base.url'] = "" + config['api']['poster.sizes'] = "" + config['api']['profile.sizes'] = "" + config['api']['session.id'] = "" + + +class Core(object): + def getJSON(self, url, language=None): + language = language or config['language'] + page = requests.get(url, params={'language': language}).content + try: + return simplejson.loads(page) + except: + try: + return simplejson.loads(page.decode('utf-8')) + except: + return + + def escape(self, text): + if len(text) > 0: + try: + return requests.utils.quote(text) + except: + return requests.utils.quote(text.encode('utf-8')) + return False + + def update_configuration(self): + c = self.getJSON(config['urls']['config']) + try: + config['api']['backdrop.sizes'] = c['images']['backdrop_sizes'] + config['api']['base.url'] = c['images']['base_url'] + config['api']['poster.sizes'] = c['images']['poster_sizes'] + config['api']['profile.sizes'] = c['images']['profile_sizes'] + return "ok" + except: + return 'not ok' + + def backdrop_sizes(self, img_size): + size_list = {'s': 'w300', 'm': 'w780', 'l': 'w1280', 'o': 'original'} + return size_list[img_size] + + def poster_sizes(self, img_size): + size_list = {'s': 'w92', 'm': 'w185', 'l': 'w500', 'o': 'original'} + return size_list[img_size] + + def profile_sizes(self, img_size): + size_list = {'s': 'w45', 'm': '185', 'l': 'w632', 'o': 'original'} + return size_list[img_size] + + def request_token(self): + req = self.getJSON(config['urls']['request.token']) + r = req["request_token"] + return {"url": "http://themoviedb.org/authenticate/%s" % r, "request_token": r} + + def session_id(self, token): + sess = self.getJSON(config['urls']['session.id'] % token) + config['api']['session.id'] = sess["session_id"] + return sess["session_id"] + + +class Movies(Core): + def __init__(self, title="", year="", limit=True, language=None): + self.limit = limit + self.update_configuration() + self.searched = title + title = self.escape(title) + self.movies = self.getJSON(config['urls']['movie.search'] % (title, str(year), str(1)), language=language) + #pages = self.movies.get('total_pages') + #if not self.limit and pages: + # if int(pages) > 1: # + # for i in range(2,int(pages)+1): # Thanks @tBuLi + # self.movies["results"].extend(self.getJSON(config['urls']['movie.search'] % (title,str(i)), language=language)["results"]) + + def __iter__(self): + if self.movies.get('results'): + for i in self.movies["results"]: + yield Movie(i["id"]) + + def get_total_results(self): + if self.limit: + return len(self.movies["results"]) + return self.movies["total_results"] + + def iter_results(self): + for i in self.movies["results"]: + yield i + + def get_ordered_matches(self): + """ + Return a list of tuples. Each tuples first element is a percentage similarity + between the search term and the tuples second element 'title' value. + + Ordered, descending, by the percentage similarity. + """ + our_results = [] + for movie in self.iter_results(): + ratio = fuzzywuzzy.fuzz.ratio(self.searched, movie['title']) + our_results.append((ratio, movie)) + return sorted(our_results, reverse=True) + + def get_best_match(self): + """ + Returns a tuple whose first element is the percent similarity between the search + term and the tuple's second element's 'title' value. + + The result is the best-matching result from all the results we get from TMDb. + """ + for show in Data: + itemIndex = itemIndex + 1 + Shref = show['link'] + Syear = show['year'][0] + + Stitle = show['title'] + + rate = scoreMediaTitleMatch(title, ruTitle, year, Stitle.encode('utf-8'), Syear, itemIndex) + shows.append({'rate': rate, 'href': Shref, 'title': Stitle, 'year': Syear}) + + shows = sorted(shows, key=lambda x: x['rate'], reverse=True) + #print str(shows) + if shows: + return shows[0] + try: + return self.get_ordered_matches()[0] + except IndexError: + return + + +class Movie(Core): + def __init__(self, movie_id, language=None): + self.movie_id = movie_id + self.update_configuration() + self.movies = self.getJSON(config['urls']['movie.info'] % self.movie_id, language=language) + self.casts = self.getJSON(config['urls']['movie.casts'] % self.movie_id, language=language) + + def is_adult(self): + return self.movies['adult'] + + def get_collection_id(self): + return self.movies['belongs_to_collection']["id"] + + def get_collection_name(self): + return self.movies['belongs_to_collection']["name"] + + # Sizes = s->w300 m->w780 l->w1280 o->original(default) + def get_collection_backdrop(self, img_size="o"): + try: + img_path = self.movies["belongs_to_collection"]["backdrop_path"] + except KeyError: + return + return config['api']['base.url'] + self.poster_sizes(img_size) + img_path + + # Sizes = s->w92 m->w185 l->w500 o->original(default) + def get_collection_poster(self, img_size="o"): + try: + img_path = self.movies["belongs_to_collection"]["poster_path"] + except KeyError: + return + return config['api']['base.url'] + self.poster_sizes(img_size) + img_path + + def get_budget(self): + return self.movies['budget'] + + def get_genres(self): + genres = [] + for i in self.movies['genres']: + genres.append({"id": i["id"], "name": i["name"]}) + return genres + + def get_homepage(self): + return self.movies['homepage'] + + def get_imdb_id(self): + return self.movies['imdb_id'] + + def get_overview(self): + return self.movies['overview'] + + def get_production_companies(self): + companies = [] + for i in self.movies['production_companies']: + companies.append({"id": i["id"], "name": i["name"]}) + return companies + + def get_productions_countries(self): + countries = [] + for i in self.movies['production_countries']: + countries.append({"iso_3166_1": i["iso_3166_1"], "name": i["name"]}) + return countries + + def get_revenue(self): + return self.movies['revenue'] + + def get_runtime(self): + return self.movies['runtime'] + + def get_spoken_languages(self): + langs = [] + for i in self.movies['spoken_languages']: + langs.append({"iso_639_1": i["iso_639_1"], "name": i["name"]}) + return langs + + def get_tagline(self): + return self.movies['tagline'] + + def get_vote_average(self): + return self.movies['vote_average'] + + def get_vote_count(self): + return self.movies['vote_count'] + + def get_id(self): + return self.movie_id + + # Sizes = s->w300 m->w780 l->w1280 o->original(default) + def get_backdrop(self, img_size="o"): + img_path = self.movies.get("backdrop_path") + if not img_path: + return + return config['api']['base.url'] + self.backdrop_sizes(img_size) + img_path + + def get_original_title(self): + return self.movies["original_title"] + + def get_popularity(self): + return self.movies["popularity"] + + def get_release_date(self): + return self.movies["release_date"] + + def get_title(self): + return self.movies["title"] + + # Sizes = s->w92 m->w185 l->w500 o->original(default) + def get_poster(self, img_size="o"): + img_path = self.movies.get("poster_path") + if not img_path: + return + return config['api']['base.url'] + self.poster_sizes(img_size) + img_path + + def get_trailers(self, language=None): + return self.getJSON(config['urls']['movie.trailers'] % self.movie_id, language=language) + + def add_rating(self, value): + if isinstance(value, float) or isinstance(value, int): + if config["api"]["session.id"] == "": + return "PROBLEM_AUTH" + sess_id = config["api"]["session.id"] + data = {"value": float(value)} + req = requests.post(config['urls']['movie.add.rating'] % (self.movie_id, sess_id), data=data) + res = simplejson.loads(bytes(req.content).decode()) + if res['status_message'] == "Success": + return True + else: + return False + return "ERROR" + + +class People(Core): + def __init__(self, people_name, limit=False, language=None): + self.limit = limit + self.update_configuration() + people_name = self.escape(people_name) + self.people = self.getJSON(config['urls']['people.search'] % (people_name, str(1)), language=language) + pages = self.people["total_pages"] + if not self.limit: + if int(pages) > 1: + for i in range(2, int(pages) + 1): + self.people["results"].extend( + self.getJSON(config['urls']['people.search'] % (people_name, str(i)), language=language)[ + "results"]) + + def __iter__(self): + for i in self.people["results"]: + yield Person(i["id"]) + + def total_results(self): + return self.people["total_results"] + + def get_total_results(self): + if self.limit: + return len(self.movies["results"]) + return self.movies["total_results"] + + def iter_results(self): + for i in self.people["results"]: + yield i + + +class Person(Core): + def __init__(self, person_id, language=None): + self.person_id = person_id + self.update_configuration() + self.person = self.getJSON(config['urls']['person.info'] % self.person_id, language=language) + + def get_id(self): + return self.person_id + + def is_adult(self): + return self.person["adult"] + + def get_name(self): + return self.person["name"] + + # Sizes = s->w45 m->w185 l->w632 o->original(default) + def get_profile_image(self, img_size="o"): + img_path = self.person.get("profile_path") + if not img_path: + return + return config['api']['base.url'] + self.profile_sizes(img_size) + img_path + + def get_biography(self): + return self.person['biography'] + + def get_birthday(self): + return self.person['birthday'] + + def get_deathday(self): + return self.person['deathday'] + + def get_place_of_birth(self): + return self.person['place_of_birth'] + + def get_homepage(self): + return self.person['homepage'] + + def get_also_known_as(self): + return self.person['also_known_as'] + + def get_image_aspect_ratio(self, image_index=0): + return self.person["images"]['profiles'][image_index]['aspect_ratio'] + + def get_image_height(self, image_index=0): + return self.person["images"]['profiles'][image_index]['height'] + + def get_image_width(self, image_index=0): + return self.person["images"]['profiles'][image_index]['width'] + + def get_image_iso_639_1(self, image_index=0): + return self.person["images"]['profiles'][image_index]['iso_639_1'] + + #Sizes = s->w92 m->w185 l->w500 o->original(default) + def get_image(self, img_size="o", image_index=0): + try: + img_path = self.person["images"]['profiles'][image_index]['file_path'] + except KeyError: + return + return config['api']['base.url'] + self.poster_sizes(img_size) + img_path + + def cast(self): + for c in self.person["credits"]["cast"]: + yield Cast(c) + + def crew(self): + for c in self.person["credits"]["crew"]: + yield Crew(c) + + +class Cast: + def __init__(self, c): + self.cast = c + + def get_id(self): + return self.cast["id"] + + def get_character(self): + return self.cast["character"] + + def get_original_title(self): + return self.cast["original_title"] + + def get_title(self): + return self.cast["title"] + + def get_release_date(self): + return self.cast["release_date"] + + # Sizes = s->w92 m->w185 l->w500 o->original(default) + def get_poster(self, img_size="o", person_index=0): + img_path = self.cast.get("poster_path") + if not img_path: + return + return config['api']['base.url'] + Core().poster_sizes(img_size) + img_path + + +class Crew: + def __init__(self, c): + self.crew = c + + def get_id(self): + return self.crew["id"] + + def get_department(self): + return self.crew["department"] + + def get_job(self): + return self.crew["job"] + + def get_original_title(self): + return self.crew["original_title"] + + def get_title(self): + return self.crew["title"] + + def get_release_date(self): + return self.crew["release_date"] + + # Sizes = s->w92 m->w185 l->w500 o->original(default) + def get_poster(self, img_size="o"): + img_path = self.crew.get("poster_path") + if not img_path: + return + return config['api']['base.url'] + Core().poster_sizes(img_size) + img_path diff --git a/resources/scrapers/tmdb.pyc b/resources/scrapers/tmdb.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a815af76f2bf960aae7c7716c24f22b0708330b0 GIT binary patch literal 27329 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 O{42xv4xit5=>Gw1qbG6z literal 0 HcmV?d00001 diff --git a/resources/scrapers/tmdb.pyo b/resources/scrapers/tmdb.pyo new file mode 100644 index 0000000000000000000000000000000000000000..2d7243faba749a43e15d2a8dfa069355de52e201 GIT binary patch literal 27835 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 Hb=Us`lgyoo literal 0 HcmV?d00001 diff --git a/resources/scrapers/tmdbs.py b/resources/scrapers/tmdbs.py new file mode 100644 index 0000000..f5fcf17 --- /dev/null +++ b/resources/scrapers/tmdbs.py @@ -0,0 +1,352 @@ +# -*- coding: utf-8 -*- + +import time +import urllib + +from cache import Cache +import tmdb + + +class TmDb: + """ + + API: + scraper - скрапер + search - поиск сериалов + movie - профайл фильма + + """ + + def __init__(self, language='en'): + tmdb.configure("57983e31fb435df4df77afb854740ea9", language=language) + dbname='tmdb.%s.db' % language + self.cache = Cache(dbname, 1.0) + + # API + + def scraper(self, search, year=None): + try: + if not isinstance(search, list): + search = [search] + tag = 'scraper:' + urllib.quote_plus(":".join(search).encode('utf8')) + except: + return None + else: + + if year: + tag += ':' + str(year) + + id = self.cache.get(tag, self._scraper, search, year) + if not id: + return None + + return self.movie(id) + + def search(self, name, year): + return self._search(name, year) + + + def movie(self, id): + id = str(id) + return self.cache.get('movie:' + id, self._movie, id) + + + def _movie(self, id): + + movie = tmdb.Movie(id) + + body = movie.movies + cast = movie.casts + + # print str(body) + + res = { + 'icon': None, + 'thumbnail': None, + 'properties': { + 'fanart_image': None, + }, + 'info': { + 'count': int(id) + } + } + + timeout = True + if not body: + return timeout, res + + # год + if body.get('release_date'): + res['info']['year'] = int(body.get('release_date').split('-')[0]) + + # постер + if body.get('poster_path'): + res['icon'] = u'http://image.tmdb.org/t/p/original' + body.get('poster_path') + res['thumbnail'] = u'http://image.tmdb.org/t/p/original' + body.get('poster_path') + + # фанарт + if body.get('backdrop_path'): + res['properties']['fanart_image'] = u'http://image.tmdb.org/t/p/original' + body.get('backdrop_path') + + for tag, retag, typeof, targettype in ( + ('plot', 'overview', None, None), + ('title', 'title', None, None), + ('originaltitle', 'original_title', None, None), + ('tagline', 'tagline', None, None), + ('premiered', 'release_date', None, None), + ('code', 'imdb_id', None, None), + ('studio', 'production_companies', list, unicode), + ('runtime', 'runtime', int, unicode), + ('votes', 'vote_count', int, unicode), + ('rating', 'vote_average', float, None), + ('genre', 'genres', list, unicode), + ): + r = body.get(retag) + if r: + if typeof == float: + res['info'][tag] = float(r) + elif typeof == list: + if targettype == unicode: + res['info'][tag] = u', '.join([x for x in [x.get('name') for x in r] if x]) + else: + res['info'][tag] = [x for x in [x.get('name') for x in r] if x] + elif typeof == int: + if targettype == unicode: + res['info'][tag] = unicode(r) + else: + res['info'][tag] = int(r) + else: + res['info'][tag] = r + + if cast and cast.get('cast'): + info_cast, info_castandrole = [], [] + for role_dict in cast.get('cast'): + if role_dict.get('name') and role_dict.get('character'): + role = role_dict['name'] + u'|' + role_dict['character'] + info_cast.append(role_dict['name']) + info_castandrole.append(role) + res['info']['cast'] = info_cast + res['info']['castandrole'] = info_castandrole + + if cast and cast.get('crew'): + for role_dict in cast.get('crew'): + if role_dict.get('name') and role_dict.get('job'): + if role_dict.get('job') == 'Director': + tag = 'director' + elif role_dict.get('job') in ['Author', 'Story']: + tag = 'writer' + else: + continue + if tag in res['info']: + res['info'][tag] = res['info'][tag] + u', ' + role_dict.get('name') + else: + res['info'][tag] = role_dict.get('name') + + timeout = True + # если фильм свежий, то кладем в кэш НЕ на долго (могут быть обновления на сайте) + if 'year' not in res['info'] or not res['properties']['fanart_image'] \ + or int(res['info']['year']) > time.gmtime(time.time()).tm_year: + timeout = 7 * 24 * 60 * 60 * 4 #4 week + + return timeout, res + + def _search(self, search, year): + movie_id = None + for name in search: + movies = tmdb.Movies(title=name, year=year, limit=True).get_ordered_matches() + print '********************************************************' + try: + print str(isAsciiString(movies[1]['title'])) + except: + pass + + if len(movies) > 0: + best = get_best(movies, search, year) + if best: + index = best['itemIndex'] + if best['rate'] > 70: + movie_id = movies[index][1]['id'] + + if movie_id: + break + + return movie_id + + + def _scraper(self, name, year): + timeout = True + + # если фильм свежий, то кладем в кэш НЕ на долго (могут быть обновления на сайте) + if year and year > time.gmtime(time.time()).tm_year: + timeout = 7 * 24 * 60 * 60 # week + + movie_id = self._search(name, year) + + if movie_id is None: + return 7 * 24 * 60 * 60 * 4, None + + else: + return timeout, movie_id + + +def isAsciiString(mediaName): + """ Returns True if all characters of the string are ASCII. + """ + for index, char in enumerate(mediaName): + if ord(char) >= 128: + return False + return True + + +def toInteger(maybeNumber): + """ Returns the argument converted to an integer if it represents a number + or None if the argument is None or does not represent a number. + """ + try: + if maybeNumber is not None and str(maybeNumber).strip() != '': + return int(maybeNumber) + except: + pass + return None + + +import difflib + +SCORE_PENALTY_ITEM_ORDER = 0 +SCORE_PENALTY_YEAR = 30 +SCORE_PENALTY_TITLE = 40 + + +def computeTitlePenalty(mediaName, title): + """ Given media name and a candidate title, returns the title result score penalty. + @param mediaName Movie title parsed from the file system. + @param title Movie title from the website. + """ + mediaName = mediaName.lower() + title = title.lower() + if mediaName != title: + # First approximate the whole strings. + diffRatio = difflib.SequenceMatcher(None, mediaName, title).ratio() + penalty = int(SCORE_PENALTY_TITLE * (1 - diffRatio)) + # print '++++++ DIFF("%s", "%s") = %g --> %d' % (mediaName.encode('utf8'), title.encode('utf8'), diffRatio, penalty) + + # If the penalty is more than 1/2 of max title penalty, check to see if + # this title starts with media name. This means that media name does not + # have the whole name of the movie - very common case. For example, media name + # "Кавказская пленница" for a movie title "Кавказская пленница, или Новые приключения Шурика". + if penalty >= 15: # This is so that we don't have to do the 'split' every time. + # Compute the scores of the + # First, check if the title starts with media name. + mediaNameParts = mediaName.split() + titleParts = title.split() + if len(mediaNameParts) <= len(titleParts): + i = 0 + # Start with some small penalty, value of which depends on how + # many words media name has relative to the title's word count. + penaltyAlt = max(5, int(round((1.0 - (float(len(mediaNameParts)) / len(titleParts))) * 15 - 5))) + penaltyPerPart = SCORE_PENALTY_TITLE / len(mediaNameParts) + for mediaNamePart in mediaNameParts: + partDiffRatio = difflib.SequenceMatcher(None, mediaNamePart, titleParts[i]).ratio() + penaltyAlt = penaltyAlt + int(penaltyPerPart * (1 - partDiffRatio)) + i = i + 1 + penalty = min(penalty, penaltyAlt) + # print '++++++ DIFF("%s", "%s") = %g --> %d' % (mediaName.encode('utf8'), title.encode('utf8'), diffRatio, penalty) + # Log.Debug('++++++ DIFF("%s", "%s") = %g --> %d' % (mediaName.encode('utf8'), title.encode('utf8'), diffRatio, penalty)) + return penalty + return 0 + + +def scoreMediaTitleMatch(mediaName, mediaAltTitle, mediaYear, title, original_title, year, itemIndex, popularity): + """ Compares page and media titles taking into consideration + media item's year and title values. Returns score [0, 100]. + Search item scores 100 when: + - it's first on the list of results; AND + - it equals to the media title (ignoring case) OR all media title words are found in the search item; AND + - search item year equals to media year. + + For now, our title scoring is pretty simple - we check if individual words + from media item's title are found in the title from search results. + We should also take into consideration order of words, so that "One Two" would not + have the same score as "Two One". Also, taking into consideration year difference. + """ + # add logging that works in unit tests. + # Log.Debug('comparing item %d::: "%s-%s" with "%s-%s" (%s)...' % + # (itemIndex, str(mediaName), str(mediaYear), str(title), str(year), str(altTitle))) + # Max score is when both title and year match exactly. + score = 100 + + # Item order penalty (the lower it is on the list or results, the larger the penalty). + #score = score - (itemIndex * SCORE_PENALTY_ITEM_ORDER) + if popularity: + score = score + popularity + + # Compute year penalty: [equal, diff>=3] --> [0, MAX]. + yearPenalty = SCORE_PENALTY_YEAR + mediaYear = toInteger(mediaYear) + year = toInteger(year) + if mediaYear is not None and year is not None: + yearDiff = abs(mediaYear - year) + if not yearDiff: + yearPenalty = 0 + elif yearDiff == 1: + yearPenalty = int(SCORE_PENALTY_YEAR / 4) + elif yearDiff == 2: + yearPenalty = int(SCORE_PENALTY_YEAR / 3) + else: + # If year is unknown, don't penalize the score too much. + yearPenalty = int(SCORE_PENALTY_YEAR / 3) + score = score - yearPenalty + + # Compute title penalty. + titlePenalty = computeTitlePenalty(mediaName, title) + altTitlePenalty, altTitlePenalty2 = 100, 100 + if mediaAltTitle not in [None, '']: + altTitlePenalty2 = computeTitlePenalty(mediaAltTitle, title) + if original_title not in [None, '']: + altTitlePenalty = computeTitlePenalty(mediaAltTitle, original_title) + + titlePenalty = min(titlePenalty, altTitlePenalty, altTitlePenalty2) + score = score - titlePenalty + + # If the score is not high enough, add a few points to the first result - + # let's give KinoPoisk some credit :-). + if itemIndex == 0 and score <= 80: + score = score + 5 + + # IMPORTANT: always return an int. + score = int(score) + # Log.Debug('***** title scored %d' % score) + return score + + +def get_best(Data, search, year): + print '****** Finding TMDB: ' + str(search) + '; year ' + str(year) + shows = [] + itemIndex = -1 + if len(search) == 2: + mediaName, mediaAltTitle = search + else: + mediaName, mediaAltTitle = search[0], None + for show in Data: + show = show[1] + itemIndex = itemIndex + 1 + Syear = None + if show.get('release_date'): + Syear = int(show.get('release_date').split('-')[0]) + Stitle = show.get('title') + popularity = int(show.get('popularity')) + Soriginal_title = show.get('original_title') + + rate = scoreMediaTitleMatch(mediaName, mediaAltTitle, year, Stitle, Soriginal_title, Syear, itemIndex, + popularity) + shows.append({'rate': rate, 'itemIndex': itemIndex}) + + shows = sorted(shows, key=lambda x: x['rate'], reverse=True) + for s in shows: + i = int(s['itemIndex']) + show = Data[i][1] + print (' ... %d: id="%s", name="%s", year="%s", score="%d".' % + (i, str(show['id']), show.get('title').encode('utf-8'), str(show.get('release_date').split('-')[0]), + s['rate'])) + if shows: + return shows[0] \ No newline at end of file diff --git a/resources/scrapers/tmdbs.pyo b/resources/scrapers/tmdbs.pyo new file mode 100644 index 0000000000000000000000000000000000000000..684cd6d8d279fb96c278142c587f5afe23502e71 GIT binary patch literal 10823 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.+?)', re.U | re.S).search(movie) + if not body: + return False, None + + body = body.group(1) + + res = { + 'icon': None, + 'thumbnail': None, + 'properties': { + 'fanart_image': None, + }, + 'info': { + 'count': int(id) + } + } + + # режисеры и сценаристы + for tag in ('Director', 'Writer'): + people = {} + people_list = [] + [people_list.extend(x.split('|')) for x in + re.compile(r'<' + tag + r'>([^<]+)', re.U | re.S).findall(movie)] + [people.update({x: 1}) for x in [x.strip() for x in people_list] if x] + if people: + res['info'][tag.lower()] = u', '.join([x for x in people.keys() if x]) + + for tag, retag, typeof, targettype in ( + ('plot', 'Overview', None, None), + ('mpaa', 'ContentRating', None, None), + ('premiered', 'FirstAired', None, None), + ('studio', 'Network', None, None), + ('title', 'SeriesName', None, None), + ('runtime', 'Runtime', None, None), + ('votes', 'RatingCount', None, None), + ('rating', 'Rating', float, None), + ('genre', 'Genre', list, unicode), + ('cast', 'Actors', list, None) + ): + r = re.compile(r'<' + retag + r'>([^<]+)', re.U | re.S).search(body) + if r: + r = r.group(1).strip() + if typeof == float: + res['info'][tag] = float(r) + elif typeof == list: + if targettype == unicode: + res['info'][tag] = u', '.join([x for x in [x.strip() for x in r.split(u'|')] if x]) + else: + res['info'][tag] = [x for x in [x.strip() for x in r.split(u'|')] if x] + else: + res['info'][tag] = r + + # год + if 'premiered' in res['info']: + res['info']['year'] = int(res['info']['premiered'].split('-')[0]) + + # постер + r = re.compile(r'([^<]+)', re.U | re.S).search(body) + if r: + res['icon'] = 'http://thetvdb.com/banners/' + r.group(1).strip() + res['thumbnail'] = 'http://thetvdb.com/banners/' + r.group(1).strip() + + # фанарт + r = re.compile(r'([^<]+)', re.U | re.S).search(body) + if r: + res['properties']['fanart_image'] = 'http://thetvdb.com/banners/' + r.group(1).strip() + + timeout = True + # если фильм свежий, то кладем в кэш НЕ на долго (могут быть обновления на сайте) + if 'year' not in res['info'] or not res['properties']['fanart_image'] \ + or int(res['info']['year']) > time.gmtime(time.time()).tm_year: + timeout = 7 * 24 * 60 * 60 * 4 #4 week + + return timeout, res + + + def _movie_clear(self, dirname): + for filename in os.listdir(dirname): + try: + os.unlink(os.path.join(dirname, filename)) + except: + raise + try: + os.rmdir(dirname) + except: + raise + + + def _search(self, search, year=None): + i = -1 + id = None + for name in search: + # print urllib.quote_plus(name.encode('utf-8')) + url = 'http://www.thetvdb.com/api/GetSeries.php?language=' + self.language + '&seriesname=' + urllib.quote_plus( + name.encode('utf-8')) + #print url + i += 1 + response = self.http.fetch(url, headers=self.headers, timeout=20) + #print response.body + if response.error: + #print "ERRRRRROR! "+str(response.error) + return None + + res = [] + rows = re.compile('(.+?)', re.U | re.S).findall(response.body.decode('utf8')) + if rows: + recmd = re.compile('([0-9]+)', re.U | re.S) + + for row in [x for x in rows if x.find(u'%s' % self.language.decode('utf8')) != -1]: + r = recmd.search(row) + if r: + res.append(int(r.group(1))) + # в некоторых случаях можно найти только по оригинальному названию, + # но при этом русское описание есть + if not res and self.language != 'en': + for row in [x for x in rows if x.find(u'en') != -1]: + r = recmd.search(row) + if r: + res.append(int(r.group(1))) + + if len(res) > 1: + Data = [] + for id in res: + for row in rows: + recmd = re.compile('([0-9]+)', re.U | re.S) + r = recmd.search(row) + if int(r.group(1)) == id: + title = re.compile('(.+?)', re.U | re.S).search(row) + Syear = re.compile('(.+?)', re.U | re.S).search(row) + if not Syear: + Syear = 0 + else: + Syear = Syear.group(1) + Data.append((title.group(1), Syear, id)) + + index = get_best(Data, search, year) + if index and index['rate'] > 70: + id = str(index['id']) + elif len(res) == 1: + id = str(res[0]) + + if id: + break + + return id + + + def _scraper(self, search, year): + timeout = True + + # если фильм свежий, то кладем в кэш НЕ на долго (могут быть обновления на сайте) + if year and year > time.gmtime(time.time()).tm_year: + timeout = 7 * 24 * 60 * 60 * 4 # 4week + + id = self._search(search, year) + + if id is None: + return 7 * 24 * 60 * 60 * 4, None + + else: + # print str((timeout, ids['data'][0])) + return timeout, id + + +def isAsciiString(mediaName): + """ Returns True if all characters of the string are ASCII. + """ + for index, char in enumerate(mediaName): + if ord(char) >= 128: + return False + return True + + +def toInteger(maybeNumber): + """ Returns the argument converted to an integer if it represents a number + or None if the argument is None or does not represent a number. + """ + try: + if maybeNumber is not None and str(maybeNumber).strip() != '': + return int(maybeNumber) + except: + pass + return None + + +import difflib + +SCORE_PENALTY_ITEM_ORDER = 0 +SCORE_PENALTY_YEAR = 40 +SCORE_PENALTY_TITLE = 40 + + +def computeTitlePenalty(mediaName, title, year=None): + """ Given media name and a candidate title, returns the title result score penalty. + @param mediaName Movie title parsed from the file system. + @param title Movie title from the website. + """ + mediaName = mediaName.lower() + title = title.lower() + if mediaName != title: + # First approximate the whole strings. + diffRatio = difflib.SequenceMatcher(None, mediaName, title).ratio() + penalty = int(SCORE_PENALTY_TITLE * (1 - diffRatio)) + # print '++++++ DIFF("%s", "%s") = %g --> %d' % (mediaName.encode('utf8'), title.encode('utf8'), diffRatio, penalty) + + # If the penalty is more than 1/2 of max title penalty, check to see if + # this title starts with media name. This means that media name does not + # have the whole name of the movie - very common case. For example, media name + # "Кавказская пленница" for a movie title "Кавказская пленница, или Новые приключения Шурика". + if penalty >= 15: # This is so that we don't have to do the 'split' every time. + # Compute the scores of the + # First, check if the title starts with media name. + mediaNameParts = mediaName.split() + titleParts = title.split() + penaltyYear = 100 + if year: + diffRatio = difflib.SequenceMatcher(None, mediaName, '%s (%s)' % (title, str(year))).ratio() + penaltyYear = int(SCORE_PENALTY_TITLE * (1 - diffRatio)) + if len(mediaNameParts) <= len(titleParts): + i = 0 + # Start with some small penalty, value of which depends on how + # many words media name has relative to the title's word count. + penaltyAlt = max(5, int(round((1.0 - (float(len(mediaNameParts)) / len(titleParts))) * 15 - 5))) + penaltyPerPart = SCORE_PENALTY_TITLE / len(mediaNameParts) + for mediaNamePart in mediaNameParts: + partDiffRatio = difflib.SequenceMatcher(None, mediaNamePart, titleParts[i]).ratio() + penaltyAlt = penaltyAlt + int(penaltyPerPart * (1 - partDiffRatio)) + i = i + 1 + penalty = min(penalty, penaltyAlt, penaltyYear) + # print '++++++ DIFF("%s", "%s") = %g --> %d' % (mediaName.encode('utf8'), title.encode('utf8'), diffRatio, penalty) + # Log.Debug('++++++ DIFF("%s", "%s") = %g --> %d' % (mediaName.encode('utf8'), title.encode('utf8'), diffRatio, penalty)) + return penalty + return 0 + + +def scoreMediaTitleMatch(mediaName, mediaAltTitle, mediaYear, title, year, itemIndex): + """ Compares page and media titles taking into consideration + media item's year and title values. Returns score [0, 100]. + Search item scores 100 when: + - it's first on the list of results; AND + - it equals to the media title (ignoring case) OR all media title words are found in the search item; AND + - search item year equals to media year. + + For now, our title scoring is pretty simple - we check if individual words + from media item's title are found in the title from search results. + We should also take into consideration order of words, so that "One Two" would not + have the same score as "Two One". Also, taking into consideration year difference. + """ + # add logging that works in unit tests. + # Log.Debug('comparing item %d::: "%s-%s" with "%s-%s" (%s)...' % + # (itemIndex, str(mediaName), str(mediaYear), str(title), str(year), str(altTitle))) + # Max score is when both title and year match exactly. + score = 100 + + # Item order penalty (the lower it is on the list or results, the larger the penalty). + #score = score - (itemIndex * SCORE_PENALTY_ITEM_ORDER) + + # Compute year penalty: [equal, diff>=3] --> [0, MAX]. + yearPenalty = SCORE_PENALTY_YEAR + mediaYear = toInteger(mediaYear) + year = toInteger(year) + if mediaYear is not None and year is not None: + yearDiff = abs(mediaYear - year) + if not yearDiff: + yearPenalty = 0 + elif yearDiff == 1: + yearPenalty = int(SCORE_PENALTY_YEAR / 2) + elif yearDiff == 2: + yearPenalty = int(SCORE_PENALTY_YEAR / 1) + else: + # If year is unknown, don't penalize the score too much. + yearPenalty = int(SCORE_PENALTY_YEAR / 1) + score = score - yearPenalty + + # Compute title penalty. + titlePenalty = computeTitlePenalty(mediaName, title, mediaYear) + altTitlePenalty, altTitlePenalty2 = 100, 100 + if mediaAltTitle not in [None, '']: + altTitlePenalty2 = computeTitlePenalty(mediaAltTitle, title, mediaYear) + + titlePenalty = min(titlePenalty, altTitlePenalty, altTitlePenalty2) + score = score - titlePenalty + + # If the score is not high enough, add a few points to the first result - + # let's give KinoPoisk some credit :-). + if itemIndex == 0 and score <= 80: + score = score + 5 + + # IMPORTANT: always return an int. + score = int(score) + # Log.Debug('***** title scored %d' % score) + return score + + +def get_best(Data, search, year): + shows = [] + itemIndex = -1 + if len(search) == 2: + mediaName, mediaAltTitle = search + else: + mediaName, mediaAltTitle = search[0], None + # print str(shows)+str(mediaAltTitle.encode('utf-8'))+str(year) + for show in Data: + itemIndex = itemIndex + 1 + Syear = None + if isinstance(show[1], unicode): + Syear = int(show[1].split('-')[0]) + Stitle = show[0] + id = show[2] + + rate = scoreMediaTitleMatch(mediaName, mediaAltTitle, year, Stitle, Syear, itemIndex) + shows.append({'rate': rate, 'id': id}) + + shows = sorted(shows, key=lambda x: x['rate'], reverse=True) + print '********************** TheTVDB ******************************' + print str(shows) + str(mediaName.encode('utf-8')) + if shows: + return shows[0] \ No newline at end of file diff --git a/resources/scrapers/tvdb.pyo b/resources/scrapers/tvdb.pyo new file mode 100644 index 0000000000000000000000000000000000000000..1a7df8019b04d7d03be44ad2181cfb16d90c5a5d GIT binary patch literal 13330 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. +''' + +import urllib +import re +import sys + +import SearcherABC + + +class EZTV(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/EZTV.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return True + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + )) + ''' + + def search(self, keyword): + filesList = [] + url="https://eztv.it/search/" + data = {'SearchString1':urllib.quote_plus(keyword), + 'SearchString':'', + 'search':'Search'} + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'https://eztv.it/'), ('Accept-encoding', 'gzip'), ] + response = self.makeRequest(url, data=data, headers=headers) + + if None != response and 0 < len(response): + #print response + dat = re.compile( + r'''class="epinfo">(.+?).+?I4`2YtpNK-73cF=2>VPKgli>Efzp*~*d0j&tKId^ z2!cz>i}R2_B6-f+{cCy1ACUZ}SKzzka`%+02xc_X)7{e_zwS}#A4>~g|MBZqK+{hN z-_J2j6H`cZjJZHzk)i?}W09|mbX>ezm*}{3wVt8l8463JX6ST=dSITRKM}nrIy#

    R|k18qc_CH+he1(v-`DPfYHy^xvO5|_zH1Tq$x z3bnDBJ{eghv=uTAt1x4jgt~Xhia;F2A*{3mC1CB)h@{7xFB*s93l*zOM&ixrB+`M{ z(}9YO5)yYiiW#U-oaBm}{7Yv=b83ZnnLx9&I*C_>(m2n=xylUo;_=lbQ;n-4$=IBV zw9fcUB&iczfyI|1k}ix>S&#X?GYB7i4Fv-3EE*&!+!{bD9KFy{BuZ& z5$)a9tAoRqs5Op6yXO0~M(gNPaN9wGQ+2L#U3!>C8V)1GnT+ivd|(y(FZ}u|$keuX z_jX%Ha7Db_Z8csro8skxFKXgV&2R125BF-mcys8#IcUD{glHmEu#h!;PpBPghDoMG zs4Ng*ygdI$NU(ucz!{*N;bDlJ%=VgF}L;KJymzKk;eU8NmO=aqG+LfHbV-lZ_!*m!SB$Bcr-jwIWTp>dGZ@f)lB6UnCjKV zrmBM^HdW`om&X0TF<*_k6Li6`geKvr4W2n*t!$(|?2L+f6)+G_<}0k~Tb)CLs_E3i zp^iJXG~JO_cKk$Q+wZ(aC3j>P;`UD7XFL~y#IslJr*my?=i1y(Zs?`Gha0rnm;G4T zJsqDlIkan_8kapP2JY(?#tjViWCtGfi6)%JNr`mHId)p0ae>}*58XsU(H%EKq_#|( z6ZFjo6h5TzC)6*|WR}L@FVYxXOEkvmEgH{4wm3oliN<9*D^d2m5Z)%l2wSKt+nIv>~ic!$iNvE5JJp(bSY6K_pa+By!C3nLmWvFWXUD%uC_ z%_l1Y2#Zu(oxFx2pFIAZ_jprOUcYMX@2!eRpD8>E!CA5*>Vqs9swx=Pyp6TZ4R3wp zi8zwm8C0sQy8gslzdl&oTo+B*lbN1sv~w`VS3Q*h*>|x1j|kibu@(d>wI8cE0LbG$ z*GvDMPI-ZcMY5WKl6bz1h5#9d+#r(1eD+ACI_@Qpo>jcxe!lXwDxcx|sT6}u^*(!4 z88YPE(Ic+S&&B?>oriR{i-$Jub{YR$TNQ`@|L0KV2L4bybFS|QDm(9j${ZX-o+=OE zH=}8kMUg(S4oz=IiB(;+8Dno^JCtY2S8qqkSWZbJK^H0EAOhZ8+%m-(!jG0zM~b!W z9JFeCdra;De=>?#!dx1r;fKj6g1$TxS(4apm#@w-y^Ai(YGj(KIAl>BTds(_C+DvO z%a3AZ0+}jQJW_}PN?+Mw#Jg^nK?2?RMX?;JZnxt4obL>0Th7$wMUsUq(1ZPE4?m^& zN`%CB0q|WVvI_Lr6fHP+AJ9a9!il!<+I9X2t(6x>zf*k1?+c4YO1ZboFj)hassf20 z>jm�G?xT=}@7Jzx#!`!UCFAsjyi1Me$d~GFA^kEn~lo`6KKe7VZ}A7AsEL|1~B~ z5^9I@hqyXGcDrE`bi4j99n;SplVislovO@U`VJ|4{Re+}^}m1ieB4YQVQ^uWXW?|Y zJb(L6#Whmja}z`1zFWBl&2Y~. +''' + +import urllib +import re +import sys +#import HTMLParser + +import SearcherABC + + +class ExtraTorrent(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/ExtraTorrent.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return True + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + )) + ''' + + def getTorrentFile(self, url): + url=url.replace('download', 'torrent') + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://extratorrent.cc/'), ('Accept-encoding', 'gzip'), ] + content = self.makeRequest(url, headers=headers) + ok=re.compile('(magnet:.+?)"').findall(content) + if len(ok)>0: + return ok[0] + + def search(self, keyword): + filesList = [] + #pars = HTMLParser.HTMLParser() + url = "http://extratorrent.cc/search/?search=%s&new=1&x=0&y=0" % (urllib.quote_plus(keyword)) + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://extratorrent.cc/'), ('Accept-encoding', 'gzip'), ] + response = self.makeRequest(url, headers=headers) + self.cookieJar.save(ignore_discard=True) + + if None != response and 0 < len(response): + #print response + dat = re.compile( + r'''.+?(.+?)(\d+)(\d+)''', + re.DOTALL).findall(response) + for (link, title, size, seeds, leechers) in dat: + size = size.replace(' ', ' ') + image = sys.modules["__main__"].__root__ + self.searchIcon + link = 'http://extratorrent.cc/'+link + filesList.append(( + int(int(self.sourceWeight) * int(seeds)), + int(seeds), int(leechers), size, + self.unescape(self.stripHtml(title)), + self.__class__.__name__ + '::' + link, + image, + )) + return filesList \ No newline at end of file diff --git a/resources/searchers/ExtraTorrent.pyo b/resources/searchers/ExtraTorrent.pyo new file mode 100644 index 0000000000000000000000000000000000000000..5871aa5b78ed15644f51f18c3f1e43407aadbcf5 GIT binary patch literal 4384 zcmd^C+in}l5$z!<>SFo6wswI{(hv}Vg0-Y1dlf*Iv`b0$T5Da5Ar(ae1EMw4Bu5<1 zjHjEDX^2nGL*9ZQ|B<}sr}B^wNKVyIvK{OO$&0fUFTFW|M#0yV}JN_ z-4mm~Jifoh$JEgHLY$y=gr5_kBTmrC`Z;luyXxn~N&c!|5GMuU=Y=kavw~=0aY6h} zh<8F9pNx@~T4{`w|1BrPl*C^>PE#FOoysKaw}VKw;#B@-b8m}hx8h`w2JMcOrLB3n zytuS1f35tWCu`j}JypEsoCIaVf^XYB6@+Ck?oDOdJAsi&8n;u`ljycmt)+=u_Clq4 zRSx35^i(8M?FYuD!D-)W8Car7YBOTqvbhKo}b*#Yjr zD)yeaTQ9Juy1BEvQ$NO4KO^+>ZL?IBi!D4HOBcvQeH2{(--JJB{#v_Qs}a z6#3V{10uvGVdE(p4d4MhXc=Y%FhH&#G(ePRL;;P(5xP#sg+E5ZlL_J0N<~tFQ3kLh z&GN2B-e^+OwEZ;4p+bxT1YFIZo;a{D700Su1t zjg0!eQ=LU>;E*+s&{R^LSzszx2b)UZ#gVCe=#O#|wLRK&_1Pi?1vFNGJxIFGttDAK z?d$g=qr+ASQo)UZ6UEkQOrD6# z_KKGp*Jd}a&2D^b@W9@~NrBl@?MU0*AnMlG)k}~XdRCG1=!=+-jOH7K=v+GD?22CB z<-`y#J}vy4!oMZjc`?k1OCio2TINrR%ba-UIK#ZKIdO(~n8J`q_A*bMVL{k2aao|g ze?xQ&BJI!+{V!@hdG0n2+_w{G{rDmZW98d%3`Q3*f(ZMJ+^@@(^3qdzba1rtWM0Cdp+3^5F9Tco`th&Ik5^>r<%{~>?t%=1t_C%F z-FRMZb<((}D_F2tUS3>TE-x)Vk;iH?g-V@PmY$TCt|t~(mSjz}R2qylvYoDO=@bt+ z1H(p0(*&cD{bkRq7`kHB^K@dr(vgR!joKU~?YBX~N;+DB#ErR$g{2-p*J}CEH}kUr z1foQb^iy_3W+1)Vf8dR5@ejC!!9*@$reMFMIti7h?G32zsjhbQ>%KM?ktRf{c?oiA z5`Sr=d$>Hrj^d9%Y*1F5{A$PYBLiu%)f-h;N_c5>-gd z9W=tZ=Lje7Ogj&p&(UX?QgBS-!!X?g;j{%|5tR=ZD1#$F_7F()?+E{{@b58NfkaFL zvye|@NOXpPB!qdwDIg4lz7viEI9`s4ZeFB24qyyFVF;C7ID5wdM9(G(x6}d1f%Y4t z1;e6v^H*_M6x+Z3i)f6A;kX!1h~cCdPKhBFO^P${2U7^q2@bp|&TbK%d~tT0Ex99R zhM0$0y368mAfO^`FF1gj-YncOS0ZH!Em=491+6D&J&uyZ%cv7wL=jrMWlji*tkZ#h)@j zUCzD#B}KUmXhsZ$YS4~Q$TU%el*fWkh++(iM?c8vdhs@R+oL z4fXo$_K4tRiO5Zk*3V+FR#6-LW&Mpce0afHB^yaERK~2&n!)TwiB$gUMEKE!q07!i zrzUx7DJ@G*F3l!N@Tl43#J9Tof5)kx!xNS~0~!p2Q%iaEbw9SciTc90G_=GnUL1D= z{k=*#Lm5=3E;*4$`*EaQiUpSl*`<<^Rc;^DtGl}{5tK_hm~PF$Fw^4KNTlTXiZw1Y~Em8c}qkawg-SR5da>k_tn@~V%)&Sdoxr<(<`!71kMU#FD&xu55XNG}hZ zFOghkoGGV>-UIx*>)g$i=n369H2h2e4!)TDug|?tmt0*OE`ElOp*Sjz6`f+SIC1;V. +''' + +import urllib +import re +import sys +import urllib2 +import xml.etree.ElementTree as ET + +import SearcherABC + + +class KickAssSo(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/KickAssSo.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return False + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + )) + ''' + + def search(self, keyword): + filesList = [] + url = "http://kickass.so/usearch/%s/?rss=1" % urllib.quote_plus(keyword) + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36', + 'Referer': 'http://kickass.so/', } + response = urllib2.Request(url, headers=headers) + response = urllib2.urlopen(response) + + if None != response: + response = response.read() + + if None != response and 0 < len(response): + #print response + torrent = re.compile('xmlns:torrent="(.+?)"').findall(response)[0] + dat = ET.fromstring(response) + for item in dat.findall('channel')[0].findall('item'): + torrentTitle = item.find('title').text + size = self.sizeConvert(long(item.find('{%s}contentLength' % torrent).text)) + seeds = item.find('{%s}seeds' % torrent).text + leechers = item.find('{%s}peers' % torrent).text + link = item.find('enclosure').attrib['url'] + image = sys.modules["__main__"].__root__ + self.searchIcon + print link + filesList.append(( + int(int(self.sourceWeight) * int(seeds)), + int(seeds), int(leechers), size, + self.unescape(self.stripHtml(torrentTitle)), + self.__class__.__name__ + '::' + link, + image, + )) + #print str(filesList) + return filesList + + diff --git a/resources/searchers/KickAssSo.pyo b/resources/searchers/KickAssSo.pyo new file mode 100644 index 0000000000000000000000000000000000000000..7af0d14653dd886aca60834d695f7d968513e000 GIT binary patch literal 3451 zcmcguTT>g!6+R<@xEPG_jcnpTrnvthl zU^ddz<{`f(KPIpHkUx;BJmd#tztc0qq;h$*q-k}ZK7G!2u06$n&d>h+w|{8_lz)o& z{}zvahan_7#pqC2pva+9OtN`_P7C9Ckxq-_`2?L#jOUYdUZV3UI-MRTXORlTz6xZlrSPGfDY`2|ah3_<^E-^9o}&;u2_*YQCGm=o3j3+J zl&QvAJRd8`C9a4hwQ$P5VeqL)`h0L1h_6NDvm5iXuI2l$PWWJJDBy5L)J^&@s|%?x z^h!mMIFn+aWqS~fwnvu6kbeuyOJQxJ@^~uDq0)EY<5r3I@Z) zsUMqb*kDB*Ytg4PC#vFY)obk4j`pjbczfi%eN*3d zg{Z?-KxifWA6IkM^paGHP#R=_cC+}OAix^%qEK}GONl@SQe6U^F9M|2*uDQ-u+{5F zN!+o90?LPk0=m7nh!e9SG*EuoHKxB=sa#!Mxt)06CTXXFY~W1Lm9O1d^)Gx5%?#52 zwF)k(TGx}CnnXF!78k}k28o(P-|4 z;z93BX4$D6wxo=qlFAH$u8bAyiVBigS8jaZ_Tx^#C&o{WPfuVlgm%HyLpvJo96Nrb zWwvA%Eu%IoB0K0a%xas>BaH%TR>Pi(o7H~*rEmPEm-twAny*pRO+O5Qp_#QDm;I2q zX55LIH=vt0pqsbgUYq++qx6B_iKW?B@kQNwnM0>JkW>ixZvhWS+uHLt*wG;x*@(ih zbBBfw2lDZ#ND5T^inM`t8BWs1Xo5_E&Wkie>`OG90H-sWw8RM-PVzx4L*n^GkdNP_W*UC5Qy^!6fOeNL#y)I=f2jiPAX`oTzHjdy7En`^;c{9&)_>qzC+>pmCxN(Q9f32m|SUb*bp1; z+85&Z&GE*IWq|~a<^@qVBi-ROJ%&EWmKp{JPq~ZLB%L|I-E}5s@d` zGL@;FccqUzQ7e#1Kf>_77sYxrucWU&E4#n?X8AMA8g%_QmXYD2RYvw~F&kwfsTV=| z<1;-%TQE?*FXN8sYOWln+U|0*>PzUeJyga)l;}Y!O%a@fG(t`jwOV)qh+8dNhnt(_ zpMz#f8AGJb4BPo`kQmuQ?Q4q+N3pY>8~1J?wHecKE5;V_VS-9$=qW6=3M1@rkwZUw z1#cXE6=m}_;^;?_-QI3km2Jd^Uoc=9OJNQ>G4j1Zy}^6xJ6TI&T;9fR@Qq_}`-b03 ztV(^I0mf^|0B+0eO_Rj5T2@PzVtedIHrek3euh@X#>}xA+o-bZ!JZ$)QU`utT9-1y z{;ugocGYSH5t0|OGsnh$PqtcR?rI)eZtcF1*H=jz+5>GkK=0#4%408k+^y|Vw9`Ji zZRVUjH>^Q;>+#rm7Fxd1;FPc~V3*h|u^C_`MN;zJr85_y@!EaW^E=Y^e>;4vOMqRR zd3=j!8yLtbIS-toGv&-WkDP_V9G*`LPn-qksdL|X<~+9FC1(NAiLP&GacA+d)c` zC8ty>O)uOlb5eWk6OZ%Gd&mRxd3Q0GyjQr=;8ob&j${wz)WF;Z)KYC(+}iP$_#lg| m=dUo;t(sN;!Du`CNS50$e3^ynYwrA-Eh{1B+4p{7uJ|MC41G=j literal 0 HcmV?d00001 diff --git a/resources/searchers/NNMClubRu.py b/resources/searchers/NNMClubRu.py new file mode 100644 index 0000000..36f18d0 --- /dev/null +++ b/resources/searchers/NNMClubRu.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import re +import os +#import time +import tempfile +import sys + +import SearcherABC + + +class NNMClubRu(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 2 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/nnm-club.ru.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return False + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + ))''' + + def search(self, keyword): + filesList = [] + url = "http://nnm-club.me/forum/tracker.php" + + data = { + 'prev_sd': '0', + 'prev_a': '0', + 'prev_my': '0', + 'prev_n': '0', + 'prev_shc': '0', + 'prev_shf': '1', + 'prev_sha': '1', + 'prev_shs': '0', + 'prev_shr': '0', + 'prev_sht': '0', + 'o': '10', + 's': '2', + 'tm': '-1', + 'sd': '1', + 'shc': '1', + 'shs': '1', + 'ta': '-1', + 'sns': '-1', + 'sds': '-1', + 'nm': keyword.decode('utf-8').encode('cp1251'), + 'submit': '%CF%EE%E8%F1%EA'} + + headers = {('Origin', 'http://nnm-club.me'), + ('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://nnm-club.me/forum/tracker.php?def=1')} + + response = self.makeRequest(url, data=data, headers=headers) + if None != response and 0 < len(response): + response = response.decode('cp1251').encode('utf-8') + #self.check_login(response) + #print response + forums = [24, 27, 23, 14, 26, 15] + regex = '(.+?).+?(?=#|).+?\d+? (.+?).+?(\d+).+?(\d+).+?' + for (forum, topic, title, link, size, seeds, leechers) in re.compile(regex, re.DOTALL).findall(response): + if int(forum) in forums and link not in ['', None]: + image = sys.modules["__main__"].__root__ + self.searchIcon + link = 'http://nnm-club.me/forum/download.php?id=' + link + '&' + topic + filesList.append(( + int(int(self.sourceWeight) * int(seeds)), + int(seeds), int(leechers), size, + self.unescape(self.stripHtml(title)), + self.__class__.__name__ + '::' + link, + image, + )) + return filesList + + def check_login(self, response=None): + if None != response and 0 < len(response): + if re.compile('').search(response): + print 'NNM-Club Not logged!' + self.login() + return False + return True + + def getTorrentFile(self, url): + self.timeout(5) + + referer = 'http://nnm-club.me/forum/viewtopic.php?t=' + re.search('(\d+)$', url).group(1) + #print url + + headers=[('Referer', referer)] + content = self.makeRequest(url,headers=headers) + + if not self.check_login(content): + content = self.makeRequest(url,headers=headers) + + return self.saveTorrentFile(url, content) + + def login(self): + data = { + 'password': 'torrenter', + 'username': 'torrenter-plugin', + 'login': '%C2%F5%EE%E4', + 'redirect': 'index.php', + 'autologin': 'on' + } + self.makeRequest( + 'http://nnm-club.me/forum/login.php', + data + ) + self.cookieJar.save(ignore_discard=True) + for cookie in self.cookieJar: + if cookie.name == 'phpbb2mysql_4_sid' and cookie.domain=='.nnm-club.me': + return 'phpbb2mysql_4_sid=' + cookie.value + return False \ No newline at end of file diff --git a/resources/searchers/NNMClubRu.pyo b/resources/searchers/NNMClubRu.pyo new file mode 100644 index 0000000000000000000000000000000000000000..c679bb937d6dd41f998f19eab86623e9fdbb5f4e GIT binary patch literal 5934 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 literal 0 HcmV?d00001 diff --git a/resources/searchers/Nyaa.py b/resources/searchers/Nyaa.py new file mode 100644 index 0000000..b1f22ca --- /dev/null +++ b/resources/searchers/Nyaa.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import urllib +import re +import sys +import HTMLParser + +import SearcherABC + + +class Nyaa(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/Nyaa.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return False + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + )) + ''' + + def search(self, keyword): + filesList = [] + pars = HTMLParser.HTMLParser() + url = "http://www.nyaa.se/?page=search&cats=1_0&term=%s&sort=2" % (urllib.quote_plus(keyword)) + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://www.nyaa.se/'), ('Accept-encoding', 'gzip'), ] + response = self.makeRequest(url, headers=headers) + + if None != response and 0 < len(response): + #print response + dat = re.compile( + r'''.+?>(.+?).+?(.+?)(\d+)(\d+)''', + re.DOTALL).findall(response) + for (title,link, size, seeds, leechers) in dat: + image = sys.modules["__main__"].__root__ + self.searchIcon + link = self.unescape(link) + filesList.append(( + int(int(self.sourceWeight) * int(seeds)), + int(seeds), int(leechers), size, + pars.unescape(self.stripHtml(title)), + self.__class__.__name__ + '::' + link, + image, + )) + return filesList \ No newline at end of file diff --git a/resources/searchers/Nyaa.pyo b/resources/searchers/Nyaa.pyo new file mode 100644 index 0000000000000000000000000000000000000000..11e141fac23ec2f6a1910b463d96f00fdbd984d1 GIT binary patch literal 3446 zcmd5;-EJGl6+R?I>ff^CxJCfC7^sLr)e0%ewt^~>5=ydS!TQ6Jsw#m2G1?uHLoIjK zJ43NF$g31ZFZvX{Z{MX)(u+Po`^_w6JAqpCra>v~?97=n=l45jHusPDncN@#TJvfA z%i;YE9^JqY5M5%-P>`iCLzkGO^DJFvZ|6C>%-zl>=yKwAo~O$^1vwIV>g1`3gA??7 zqVI_=E(=y-wV1bx{+=b8VffWll8DHNgvDX6B_q~U3H$BN(XQLwRq-H^t+rvs-6giR zvbx58!voo6)oYbpamRCG2_@|a-?X}1h9zHhXHw~Hsac$;R>Hds(`F(B)2eCuJP{jg zpnA;b5lciMwMpbv&j=>>L~()Gpu(+drrszp7T*{)xvb?6l(54tCEDD;_&N^G;8yuS$$n5h_^dB>aa^ zThw$_B3K{{5THwG{x6VV4fDc)wfT)eqJ1H6U>s*YpmiJGe=peS<)MmN&QX~10Z_2+ zpvfX-mYIf?n{8v_jdHo)@0VIpucVSz8ECLb(Bx z4TC`Op=dC=QnN*dvYW8=gsQTYgo;EVxvILHByU_#*h%Z@T)1)pI5qI$i;v9Kf+xO( z7YgD=1|mo?az0LXw-*|jrVh{xM3aNS`c7WTx%UH_tta>$XcqOlS0V+b%veu;iJ_c` z)B;_;RjkX>SCKAT_e*iq@-6f2vuh99;21)au+(EW8rv`Sd8kFYv@BYL%_8392K^mo zyBqa0jk2j%g076}l{ntxhSxpCv24}fpp@%82%x^6Hky(Rfhw8X{!@Q%Z~eW!_0-aV z`2-rIKH{xNm_r#|S6ysZLDe>Wl=bcF9-e7D&Xr%og%;5$YaQyi7C3S((`2ZVrD4XV z@@FG-&Up&%QLsR*9F6ic1b2>xpij{-52nlr`6e0`=sHKq%SpT|T7F zrxeW5V`z9hoTuib-ORlG6P-tJ)Ls(z5yoTvCB~1cDzdoIqWpEtTVgBC(o>%sy|vm{ zd1|}z*5~@ER*BhK(=#}05%EQ(h5JSS5z8a>4p`^qm!%a}JeN_R`kEcr*m`O8D|UWz zzW!o~0XU&J7gukjDZhOFW$F1kE53PMJ33rup}ZDo_5QV5V!Q1`bwwErE2XuS^|jLK z+6#8UcM^ycNqO}}Y4!ca%K9p+@+ME@SfZJPF`j6O1b}^bw~u-O^os9`*nA-(AMlM@ zu6MNF$=C^K3yup(OYo8Y8-`62FhAs4Z!H>JIws;>vAA7&_VsoV!_sD%Z*P`Ou>E5` zgdqwQ4;HsKIcq1PxwYsHEHWcaD7F^&ZW+)&!>z?gHB}g@zLWi9VOqX}(y_ujl<5e& z_23!Ixnno{!LFHtSB(a)^r+Erg|@L#w1xKnoZQsF|02UF;~i;sUC^ev_z1qDM2Rc_ zPk91pp~Q)LNf^p2xAV5AjA)>xX)}wRF25F@c-s@&q&JO1$I4+NL=o7~CBlIRUr4bG zg_E{-QmY&uI&u?5!Nbs<&;#vg_zLQUke4PSQOYzLPIX#<2WaVTuNMjJ^Ej2s<5)z2 zlOrQz=Ab#f4buC`*fwduxZ>BQ8@g4a;jjzYsUnNsMx$tZs%H&%wp@!rUnPM%(1iW^ z5IA>^#)ytnhuC;FMotWRdW@Ezh5#Q~?lN(xc85Z=ayPN4b$jkYb4NoV>}9DPS$5HJ zijew~-8j~TG{6-*`<2z5DP-m{578-ect6ViB3r=hQRYeJab^K~PcVO!d60RKE!q%z zPcXPdp@dux5nGGPMk7#uqv3sKnHVc%l!*(1C{as literal 0 HcmV?d00001 diff --git a/resources/searchers/OldPirateBay.py b/resources/searchers/OldPirateBay.py new file mode 100644 index 0000000..67db82d --- /dev/null +++ b/resources/searchers/OldPirateBay.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import urllib +import re +import sys + +import SearcherABC + + +class OldPirateBay(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/OldPirateBay3.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return False + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + )) + ''' + + def search(self, keyword): + self.timeout(10) + filesList = [] + url = "http://oldpiratebay.org/search.php?q=%s" % (urllib.quote_plus(keyword)) + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://opensharing.org/'), ('Accept-encoding', 'gzip'), ] + response = self.makeRequest(url, headers=headers) + + if None != response and 0 < len(response): + #print response + dat = re.compile( + r'''.+?CsixFEkR&re%DgDG~Go0Vd=KnQU{N`_e zsrxkft9_(}(Ap5L#7N;$4WzG%5RhIFp)8{gD{kUJuw0EUqNg8)j-e(xLQz4j&+xmj1VvP;s z0rPppQV~d{Q`s75!K7w93d%5}9|y8Mw2HtSL;(F^1CLeMVa2QOZXfMcJa%~G9Uj!)xQx{hDp+VW{EtwZ ztm((8V1dxc0Oe-)e}W5EFfR;Pm!AtGgN+ps0pI~VpcZBZV1V2d34kbX5d}0BCg?hyA#Z{!U@gPdv9Pc~k}BkhFRqxc z1W$dFW&p;y3`CIS%JJmd`-4!+>BfoO9u*oD=XNxuFb&)^FF2Z}|5eoJHtDjnm= zB1kzEnFXqRd9W%=KaN!SY8almN!0PpuFGfJXqW=ggsNe z8Q!>RvYQO`U7RG> zKO@7@1?tUEaD&X?8hy-B4|}b^xIo|iokj(E{fEC&W17Y@G`>dT>ohLX_y&zIo~6-s z>J=%NrC`o%#;U$SJxp)XuX=OVqMI~7o}=Ivjb>o<42^KcEz-Bm-?(|lSYyUTGq`_s zVz@U97snXUyO!Rg(X3$_KA88Z_ke=iG!Omrqd98Nm=)*!pXoS)@1~>NM`)|E2&%pU zncy%EgT#WY#fKJ**)6(BH+lJf<2Oo~4JJjNRyycF>Q9*N#~*+KUjEu$Vx?ml1@VPq z)jC^smtU~sgX7ib3k;bQieu4wCw2MjXWzKbR$1xY+xq_AA`9i2Kr`^q;sv(dP2;{O zLtx2WSz29jmsg&%6TX!~rAW)m&)wxu3rnlZtj60sl@pD62F7@zEmCCg{1u-Pl#?#x zqE6=0Ev!|1UnKgehwx(oS8C&tmO2zqVbG&Z z_sPq3&bp~+Z+z9a*}T?x`JLVvq|sVS%kEkU5(|%cKQWRj;nAk$te5S0z09qO&$^ZT zFi|~`)4}GIqfNnpSy1+9v(yNlEUcHmFAxf0YSa%T$~xUt1^DqeYN_M}AVb9THPB`g zy+3L;)o(GGhm+j!H#g&37VuYQa$u4f_Nya)3#H*&MMx!K%o{y!st!f^lq literal 0 HcmV?d00001 diff --git a/resources/searchers/OpenSharing.py b/resources/searchers/OpenSharing.py new file mode 100644 index 0000000..5e389bb --- /dev/null +++ b/resources/searchers/OpenSharing.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import urllib +import re +import sys + +import SearcherABC + + +class OpenSharing(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/OpenSharing.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return False + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + )) + ''' + + def search(self, keyword): + filesList = [] + url = "http://opensharing.org/newsearch.php?search_word=%s&search_type=1&search_place=0&search_cat=0&search_sort=1&search_direction_asc=1" % urllib.quote_plus( + keyword) + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://opensharing.org/'), ('Accept-encoding', 'gzip'), ] + + response = self.makeRequest(url, headers=headers) + + if None != response and 0 < len(response): + #print response + dat = re.compile( + r'.+?.+?(.+?).+? (\d+).+?alt="leechers".+?>.+? (\d+).+?(.+?)9@E7e6+wnWU10DDOl25f=NnleAGkyrwyl&YC&Ne!c! z@pKDCF6m~Si`?W@@&dWf%j6;#d4S|QJra1Uys5p~U4f3ePoF-2eZJG3|Ib|UEctuQ zXQNLZzc29BRgi$Ob5Mr`ITkwX9D{6}W9PZ?IM2@WJKKAD8uSOboPlSl11L0D~QMW8(uhWtYEu9nSi zxNLPGGyHVF_WJmw#w$l>{IueEm806(Gf10uj8%CpGhM2agbD#8#i@u)A2C=Jhp)Wd z*Vt3p*+1B?ogoyyw_iJYRju;9V~L{&_x8B@%H_O@RKY{5;s2zX zs-_dCk_XbD0<@c*{}~Qg!@V%zZE-De(7sgHa87U^r8Q3Pk1MuzMHojd8z@}4Ehu=m z-{etjmbr$Pn{8u~jdHoy>$$C{>&9uTjB21t(B*BnsQ!!3k-3BNKTc#+ZHrVztsC3{ z5NwB_u?8Z6J75RYqKxnb#7!^>4CO7L0LH=yT<25F8^H=t%V2dXEoxAs8fD_kkG$7X zq&`&{aB-~y8Dyn$Iy&`EH#90cK~!KMn*t2pv-&d0mp|YUtPp;ndDQJ($gDn{))@9|#kuHCf1vfz^XwUe&OZz843`5Hx?vbU2y2qXfwalg@qGi}D;g?yW zku|ovQ9scDQN0p$R8+4d$xC5G-HQdLt@;}PyDowNUevR;<5DJK*NnSS{l@M3jobAf zINUd%!I092q7_MVprWg)&GZVmnhulYeEPYI?+m^+qVEt%i?N|SRfKlwuz|xqIPCKw zj`%JM=2>u$weoB@!3J2)u>ttgY%l>KXNc2hY%s~L@+|e7V1^lpP161=MjT}45>-)T zG?=nv#IA(bV)4xwSf;C86-;*2;M53v)ZsacXWQ1BK2)owy;i zzqP81aDxi)>q-lkoBk`Nhw*zLOq9QIS9s}EMM2!t{HVs)-PLFO^!RlB=@LhshVoQi zyiun7&67X4Pu6+q&Fk9X!7>lkmBc;cU&Tv&x1GivS%$!hySB2v=B}$?p=w22i}nGsxIHorvslxgBi>IJnwiE@qk)G=)M(gFu(461 zPVj54ip;^ESQ?q|C+fp?Y^smaBgAV8Al)L^AZ%|k8(WGG*$v}K0JT%tm0wY@y9RSpge-3R-2u?ZlFFf`O*=>?a(Hl5I(KsS=w z7fGg4_q7$ri>@2OV0J`l9GgbN`j+8;ANP{ABN8-^zWOw7XNpKlu&f+m>6B6Q1vG<)( z2Jzc>GhMWH$GC{Cq*m{xb#ion)owN@piY)x=I6c~DYPu9FK9%!B6AAPj8k-&lXqrw zk8;1w6)^e|T>8#C51a)%e&jrI?mG{2CCaP!C5SyDK+2vT5>9p6Xaup}Xn0?c5cM&e z7QAT^nVP;wh2$-P+y-w)Kil)bgKb96Ti6#S3r?X>n4Z5^qRe=YiP-q&X!H=of}%Ql foK<#qt%6_5dz;M7EaBS^;9V9)Zq~tHZZ`iv>kinH literal 0 HcmV?d00001 diff --git a/resources/searchers/RiperAM.py b/resources/searchers/RiperAM.py new file mode 100644 index 0000000..7b68e33 --- /dev/null +++ b/resources/searchers/RiperAM.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import urllib +import re +import sys + +import SearcherABC + + +class RiperAM(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/RiperAM.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return True + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + )) + ''' + + def search(self, keyword): + filesList = [] + + url = "http://www.riper.am/search.php?tracker_search=torrent&keywords=" + urllib.quote_plus( + keyword) + "&terms=all&fp=1&author=&fid%5B%5D=238&fid%5B%5D=368&fid%5B%5D=425&fid%5B%5D=50&fid%5B%5D=52&fid%5B%5D=424&fid%5B%5D=51&fid%5B%5D=371&fid%5B%5D=251&fid%5B%5D=349&fid%5B%5D=350&fid%5B%5D=351&fid%5B%5D=352&fid%5B%5D=239&fid%5B%5D=420&fid%5B%5D=12&fid%5B%5D=13&fid%5B%5D=423&fid%5B%5D=16&fid%5B%5D=17&fid%5B%5D=18&fid%5B%5D=46&fid%5B%5D=15&fid%5B%5D=14&fid%5B%5D=240&fid%5B%5D=19&fid%5B%5D=216&fid%5B%5D=363&fid%5B%5D=118&fid%5B%5D=153&fid%5B%5D=632&fid%5B%5D=319&fid%5B%5D=183&fid%5B%5D=178&fid%5B%5D=364&fid%5B%5D=267&fid%5B%5D=365&fid%5B%5D=353&fid%5B%5D=710&fid%5B%5D=266&fid%5B%5D=268&fid%5B%5D=160&fid%5B%5D=20&fid%5B%5D=210&fid%5B%5D=969&fid%5B%5D=707&fid%5B%5D=685&fid%5B%5D=1004&fid%5B%5D=1028&fid%5B%5D=711&fid%5B%5D=736&fid%5B%5D=550&fid%5B%5D=601&fid%5B%5D=979&fid%5B%5D=692&fid%5B%5D=1038&fid%5B%5D=48&fid%5B%5D=555&fid%5B%5D=781&fid%5B%5D=790&fid%5B%5D=791&fid%5B%5D=509&fid%5B%5D=803&fid%5B%5D=994&fid%5B%5D=735&fid%5B%5D=992&fid%5B%5D=748&fid%5B%5D=771&fid%5B%5D=656&fid%5B%5D=501&fid%5B%5D=980&fid%5B%5D=1002&fid%5B%5D=964&fid%5B%5D=746&fid%5B%5D=976&fid%5B%5D=958&fid%5B%5D=719&fid%5B%5D=1006&fid%5B%5D=798&fid%5B%5D=768&fid%5B%5D=984&fid%5B%5D=732&fid%5B%5D=376&fid%5B%5D=152&fid%5B%5D=628&fid%5B%5D=563&fid%5B%5D=565&fid%5B%5D=562&fid%5B%5D=797&fid%5B%5D=983&fid%5B%5D=774&fid%5B%5D=989&fid%5B%5D=354&fid%5B%5D=640&fid%5B%5D=684&fid%5B%5D=1024&fid%5B%5D=961&fid%5B%5D=639&fid%5B%5D=703&fid%5B%5D=1013&fid%5B%5D=1040&fid%5B%5D=131&fid%5B%5D=727&fid%5B%5D=1015&fid%5B%5D=641&fid%5B%5D=686&fid%5B%5D=644&fid%5B%5D=760&fid%5B%5D=373&fid%5B%5D=654&fid%5B%5D=779&fid%5B%5D=372&fid%5B%5D=957&fid%5B%5D=1016&fid%5B%5D=766&fid%5B%5D=687&fid%5B%5D=991&fid%5B%5D=272&fid%5B%5D=761&fid%5B%5D=653&fid%5B%5D=551&fid%5B%5D=645&fid%5B%5D=986&fid%5B%5D=795&fid%5B%5D=750&fid%5B%5D=635&fid%5B%5D=962&fid%5B%5D=683&fid%5B%5D=708&fid%5B%5D=978&fid%5B%5D=997&fid%5B%5D=1026&fid%5B%5D=787&fid%5B%5D=773&fid%5B%5D=671&fid%5B%5D=1019&fid%5B%5D=1023&fid%5B%5D=225&fid%5B%5D=799&fid%5B%5D=788&fid%5B%5D=680&fid%5B%5D=794&fid%5B%5D=972&fid%5B%5D=359&fid%5B%5D=756&fid%5B%5D=1000&fid%5B%5D=552&fid%5B%5D=706&fid%5B%5D=1003&fid%5B%5D=630&fid%5B%5D=966&fid%5B%5D=226&fid%5B%5D=960&fid%5B%5D=995&fid%5B%5D=699&fid%5B%5D=714&fid%5B%5D=755&fid%5B%5D=358&fid%5B%5D=642&fid%5B%5D=1039&fid%5B%5D=360&fid%5B%5D=981&fid%5B%5D=977&fid%5B%5D=681&fid%5B%5D=675&fid%5B%5D=988&fid%5B%5D=355&fid%5B%5D=1025&fid%5B%5D=973&fid%5B%5D=445&fid%5B%5D=678&fid%5B%5D=970&fid%5B%5D=733&fid%5B%5D=505&fid%5B%5D=646&fid%5B%5D=1031&fid%5B%5D=990&fid%5B%5D=691&fid%5B%5D=1033&fid%5B%5D=690&fid%5B%5D=1030&fid%5B%5D=804&fid%5B%5D=780&fid%5B%5D=778&fid%5B%5D=805&fid%5B%5D=500&fid%5B%5D=743&fid%5B%5D=21&fid%5B%5D=185&fid%5B%5D=463&fid%5B%5D=633&fid%5B%5D=772&fid%5B%5D=606&fid%5B%5D=789&fid%5B%5D=162&fid%5B%5D=151&fid%5B%5D=22&fid%5B%5D=198&fid%5B%5D=232&fid%5B%5D=245&fid%5B%5D=246&fid%5B%5D=592&fid%5B%5D=594&fid%5B%5D=591&fid%5B%5D=595&fid%5B%5D=596&fid%5B%5D=597&fid%5B%5D=242&fid%5B%5D=164&fid%5B%5D=167&fid%5B%5D=165&fid%5B%5D=166&fid%5B%5D=241&fid%5B%5D=23&fid%5B%5D=446&fid%5B%5D=366&fid%5B%5D=553&fid%5B%5D=693&fid%5B%5D=229&fid%5B%5D=967&fid%5B%5D=975&fid%5B%5D=491&fid%5B%5D=516&fid%5B%5D=1032&fid%5B%5D=528&fid%5B%5D=577&fid%5B%5D=770&fid%5B%5D=478&fid%5B%5D=534&fid%5B%5D=540&fid%5B%5D=674&fid%5B%5D=1010&fid%5B%5D=471&fid%5B%5D=593&fid%5B%5D=538&fid%5B%5D=744&fid%5B%5D=561&fid%5B%5D=526&fid%5B%5D=605&fid%5B%5D=713&fid%5B%5D=344&fid%5B%5D=459&fid%5B%5D=959&fid%5B%5D=191&fid%5B%5D=519&fid%5B%5D=527&fid%5B%5D=460&fid%5B%5D=190&fid%5B%5D=659&fid%5B%5D=477&fid%5B%5D=255&fid%5B%5D=256&fid%5B%5D=634&fid%5B%5D=574&fid%5B%5D=764&fid%5B%5D=637&fid%5B%5D=33&fid%5B%5D=270&fid%5B%5D=450&fid%5B%5D=514&fid%5B%5D=658&fid%5B%5D=209&fid%5B%5D=530&fid%5B%5D=800&fid%5B%5D=475&fid%5B%5D=517&fid%5B%5D=548&fid%5B%5D=740&fid%5B%5D=741&fid%5B%5D=737&fid%5B%5D=587&fid%5B%5D=718&fid%5B%5D=1011&fid%5B%5D=456&fid%5B%5D=682&fid%5B%5D=469&fid%5B%5D=479&fid%5B%5D=480&fid%5B%5D=696&fid%5B%5D=996&fid%5B%5D=189&fid%5B%5D=1027&fid%5B%5D=541&fid%5B%5D=785&fid%5B%5D=668&fid%5B%5D=560&fid%5B%5D=752&fid%5B%5D=533&fid%5B%5D=447&fid%5B%5D=775&fid%5B%5D=993&fid%5B%5D=529&fid%5B%5D=793&fid%5B%5D=586&fid%5B%5D=525&fid%5B%5D=522&fid%5B%5D=1018&fid%5B%5D=1020&fid%5B%5D=472&fid%5B%5D=769&fid%5B%5D=484&fid%5B%5D=1009&fid%5B%5D=971&fid%5B%5D=511&fid%5B%5D=531&fid%5B%5D=638&fid%5B%5D=269&fid%5B%5D=1017&fid%5B%5D=782&fid%5B%5D=754&fid%5B%5D=524&fid%5B%5D=228&fid%5B%5D=715&fid%5B%5D=559&fid%5B%5D=765&fid%5B%5D=636&fid%5B%5D=730&fid%5B%5D=679&fid%5B%5D=493&fid%5B%5D=545&fid%5B%5D=537&fid%5B%5D=792&fid%5B%5D=547&fid%5B%5D=731&fid%5B%5D=468&fid%5B%5D=588&fid%5B%5D=348&fid%5B%5D=539&fid%5B%5D=982&fid%5B%5D=747&fid%5B%5D=490&fid%5B%5D=536&fid%5B%5D=742&fid%5B%5D=544&fid%5B%5D=963&fid%5B%5D=457&fid%5B%5D=786&fid%5B%5D=520&fid%5B%5D=518&fid%5B%5D=575&fid%5B%5D=489&fid%5B%5D=495&fid%5B%5D=271&fid%5B%5D=496&fid%5B%5D=689&fid%5B%5D=515&fid%5B%5D=449&fid%5B%5D=492&fid%5B%5D=535&fid%5B%5D=1021&fid%5B%5D=1005&fid%5B%5D=1012&fid%5B%5D=783&fid%5B%5D=521&fid%5B%5D=470&fid%5B%5D=698&fid%5B%5D=451&fid%5B%5D=694&fid%5B%5D=697&fid%5B%5D=762&fid%5B%5D=677&fid%5B%5D=1008&fid%5B%5D=753&fid%5B%5D=497&fid%5B%5D=188&fid%5B%5D=494&fid%5B%5D=738&fid%5B%5D=767&fid%5B%5D=1034&fid%5B%5D=543&fid%5B%5D=448&fid%5B%5D=59&fid%5B%5D=279&fid%5B%5D=281&fid%5B%5D=1035&fid%5B%5D=280&fid%5B%5D=542&fid%5B%5D=676&fid%5B%5D=763&fid%5B%5D=576&fid%5B%5D=578&fid%5B%5D=579&fid%5B%5D=589&fid%5B%5D=580&fid%5B%5D=581&fid%5B%5D=582&fid%5B%5D=583&fid%5B%5D=584&fid%5B%5D=585&fid%5B%5D=24&fid%5B%5D=194&fid%5B%5D=69&fid%5B%5D=669&fid%5B%5D=704&fid%5B%5D=88&fid%5B%5D=379&fid%5B%5D=68&fid%5B%5D=65&fid%5B%5D=784&fid%5B%5D=729&fid%5B%5D=89&fid%5B%5D=701&fid%5B%5D=643&fid%5B%5D=532&fid%5B%5D=63&fid%5B%5D=590&fid%5B%5D=796&fid%5B%5D=652&fid%5B%5D=498&fid%5B%5D=614&fid%5B%5D=739&fid%5B%5D=801&fid%5B%5D=965&fid%5B%5D=974&fid%5B%5D=670&fid%5B%5D=650&fid%5B%5D=252&fid%5B%5D=649&fid%5B%5D=802&fid%5B%5D=647&fid%5B%5D=728&fid%5B%5D=452&fid%5B%5D=323&fid%5B%5D=998&fid%5B%5D=599&fid%5B%5D=333&fid%5B%5D=672&fid%5B%5D=655&fid%5B%5D=1014&fid%5B%5D=1007&fid%5B%5D=712&fid%5B%5D=673&fid%5B%5D=759&fid%5B%5D=758&fid%5B%5D=334&fid%5B%5D=999&fid%5B%5D=332&fid%5B%5D=660&fid%5B%5D=648&fid%5B%5D=331&fid%5B%5D=335&fid%5B%5D=327&fid%5B%5D=324&fid%5B%5D=705&fid%5B%5D=1029&fid%5B%5D=329&fid%5B%5D=336&fid%5B%5D=702&fid%5B%5D=328&fid%5B%5D=1022&fid%5B%5D=325&fid%5B%5D=337&fid%5B%5D=330&fid%5B%5D=326&fid%5B%5D=25&fid%5B%5D=127&fid%5B%5D=616&fid%5B%5D=201&fid%5B%5D=146&fid%5B%5D=145&fid%5B%5D=985&fid%5B%5D=661&fid%5B%5D=211&fid%5B%5D=192&fid%5B%5D=622&fid%5B%5D=346&fid%5B%5D=199&sc=1&sf=firstpost&sr=topics&sk=ts&sd=d&st=0&ch=300&t=0&submit=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA" + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://www.riper.am/'), ] + #('Cookie',str(sys.modules[ "__main__" ].__settings__.getSetting("rutor-auth")))] + response = self.makeRequest(url, headers=headers) + + if None != response and 0 < len(response): + #print response + dat = re.compile( + r'(.+?).+?Размер: (.+?).+?" title="Сидеров">(\d+?).+?title="Личеров">(\d+?)', + re.DOTALL | re.I).findall(response) + if dat: + for (link, title, size, seeds, leechers) in dat: + torrentTitle = title + size = self.stripHtml(size) + link = 'http://www.riper.am' + link + image = sys.modules["__main__"].__root__ + self.searchIcon + filesList.append(( + int(int(self.sourceWeight) * int(seeds)), + int(seeds), int(leechers), size, + self.unescape(self.stripHtml(torrentTitle)), + self.__class__.__name__ + '::' + link, + image, + )) + return filesList + + def getTorrentFile(self, label): + if re.search('/download/', label): + return label + elif label.startswith('http'): + return self.getByLink(label) + else: + return self.getByLabel(label) + + + def getByLink(self, label): + response = self.makeRequest(label) + if None != response and 0 < len(response): + link = re.compile('(/download/file\.php\?id=\d+)', + re.DOTALL | re.MULTILINE).findall(response)[0] + return 'http://www.riper.am' + link \ No newline at end of file diff --git a/resources/searchers/RiperAM.pyo b/resources/searchers/RiperAM.pyo new file mode 100644 index 0000000000000000000000000000000000000000..234663a5290c16efc897b3696f0fd8c7a3c9f2d5 GIT binary patch literal 10866 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. +''' + +import urllib +import re +import sys + +import SearcherABC + + +class RuTorOrg(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/rutor.org.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return False + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + )) + ''' + + def search(self, keyword): + filesList = [] + self.timeout(5) + #print 'strating Rutor' + url = "http://rutor.org/search/0/0/100/2/%s" % urllib.quote_plus(keyword) + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://rutor.org'), ('Accept-encoding', 'gzip'), + ('Cookie', str(sys.modules["__main__"].__settings__.getSetting("rutor-auth")))] + response = self.makeRequest(url, headers=headers) + + #print response + + if None != response and 0 < len(response): + cookie = re.compile("document.cookie='(.+?)';").findall(response) + if cookie: + #print 'ok found cookie' + cookie = cookie[0] + #print str(cookie) + sys.modules["__main__"].__settings__.setSetting("rutor-auth", cookie) + headers = [('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://rutor.org'), ('Accept-encoding', 'gzip'), + ('Cookie', str(sys.modules["__main__"].__settings__.getSetting("rutor-auth")))] + response = self.makeRequest(url, headers=headers) + + if None != response and 0 < len(response): + dat = re.compile( + '.+?.+?(.+?).+?(\d*?\..+? .+?).+? (\d+).+?alt="L".+?> (\d+)', + re.DOTALL).findall(response) + if dat and len(dat) > 0: + for (link, title, size, seeds, leechers) in dat: + torrentTitle = title.strip() #"%s [S\L: %s\%s]" % (title, seeds, leechers) + size = size.replace(' ', ' ') + image = sys.modules["__main__"].__root__ + self.searchIcon + filesList.append(( + int(int(self.sourceWeight) * int(seeds)), + int(seeds), int(leechers), size, + self.unescape(self.stripHtml(torrentTitle)), + self.__class__.__name__ + '::' + link, + image, + )) + return filesList + diff --git a/resources/searchers/RuTorOrg.pyo b/resources/searchers/RuTorOrg.pyo new file mode 100644 index 0000000000000000000000000000000000000000..7312db875727cc7a1dfc467d86d9dc276db80be7 GIT binary patch literal 4104 zcmd^CUsD^&5$~0Rz!?8GHokMNrl?C!&eL}8Isi4IEC0dt9dPxPK> zcW;cf)GK4G{I3O~Nr6uz$ubpNm5DSObagB`NhW^t^wpZ%T}#rFOm}-$RMzf^g}M0! z@oO3CzNjB2*}ilOtxn?mLTT)0;z(r%Yw_^xkdemw zBFUUN6=~V{Oe84_-h;&_B9a`&k*x3dJ{g1$zJ>w;XN!7C3b%UD3P+E16p4K$21a!T z(S4@_kr6u^jThT*8ltwfD|Tu@P}^$kJ_fh#CD>I*D%Yj^X{6yWLY&Fip1=pE;?=WY z?FD3NPd7F<8oO{sJl|++J*(Hn^X)*?#Oqqn*jRhBSqsGLH^J-e`ZHgMIzj~torZrA zYR;N|k|_}?iwrP+e*e3;U<31_Q1s-H!bP{0K7w&lw2@k8;r-`|-MKPK;;wTPrhG^! zShvv;aboWa11pz%)}~9<>hbZh-;D=;l69-d2F?UiUG*pR-|^Y96G;DHfVAJvy62z+ z8t5tGVgZ8!=l~py4q^;0z^z0I04h2(0g2@ivi8O)7-0%H%Q3a19AuE7207AJADM2H z%-Wn{0L76GRhZ|=&gjbfgUIUq`jCF1>PQg8vD24xuK$3>n1b)25%HkEukz&79(z*3 zP|Z|sfvKJyY^u7Q#HN}JY?5(|{50;iS>o)w#?mDWmQXF2y5&a8h2y!5jLMhHVpP=O zgUAg=Vz#!_d}Dy0W-aXNxLHfnb!lZYNFypH1mq%a~u*M=H!K_d2V#` z-00@njrr+`y^d3~c_q8CvYR?Sth*r3fok|3snF)1EBIc(*SWI*N|$I@pi`m)S5e=4 zg%_C-f1Lt#OEfGwg%flN z$tgN5Vapprfar9L4vUn{c;O|ole~n~Au+{Xq=P96FEi!f(r9Z~rqeR-VuZ*Ytbcg; zWj-96?+Y;e7KOJdocYhJd^_XC?u{AQ>KA@&t6vz|dWCp$g%AH=@i?81QwAQmH_pyL z{IJB7-~E{>>)-#0nqxGapy34?PSWrq4H2XZba0hlq#<0Nq=Rb|UZwCFs|L?UK3{jS zy+OB!m+2Je-XuHCe|&|v_&A=s`?&e>f~ixy4du*w+l@1HdWnfl2k{Oad`97Qx_vr< z?`7&Z`@Ofu+j;935EUF)uiQcYY-#skeu?R*z??&81gh#B{>{(LRTrv1H)axy41fo< zF5Xr12P|JD?|^Sv{l=dYl^q?2$*~bz4YBCYKNdUNJByF*3E(7BJ8J)>w$*PQ{>p#2 zC@L>sG+u4q7m+?xc;ecJ$vv^w%aXpTf?>{Im|I-%=NBG{UHLSFN|jaTANlj=8*_{E zqAoi!(<6;`9L5ByqcY(0>L(mB44PWIty23y#ce<}?&3m#op(C5WlYwRM4^Ja#d8AP2VR4(Tb0$J%H}keR^{Chb8V@jz?93Rb?V_+Ni}@2kh=FW6kRnP^AS zn3dVz+V1z*S(X@jnd+>}GGi4Hi=#w_RhF7vbsQq!$NUonr+&FASC^|cbo>^NPNci> z%B*W>W>+iC@R#2+ZfUZTD{RDpUs z0K3EFR)Y7Bl}5l7XI7@1PBh=Cj`Dd2#YRSvQwQy5>Nr2ww;Q$1P4}pC>zz8;Or?=* zpW!=85<9Xbe~CBHIyetynyNT-r|Z}{^Yca{Z+%>S7{to7WvVQ{!tRI{wja4wtL5Mh z-4obrwPM*_spdQ%D78HTm}Qb)k3LmwF1FRKVv3lN4J`)%$@|CZvi*SAENOSh9tnjbQfP& zM9X7kuUsxqT)A4|Pz8^8V59`oJY2@$fKwm!+_k4`PQic0bQi|uJk+Z. +''' + +import urllib +import re +import sys +import tempfile +import os +import time + +import SearcherABC + + +class RuTrackerOrg(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 2 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/rutracker.org.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return False + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + )) + ''' + + def search(self, keyword): + filesList = [] + url='http://rutracker.org/forum/tracker.php?nm=' + urllib.quote_plus(keyword) + + data = {'prev_my': '0', + 'prev_new': '0', + 'prev_oop': '0', + 'o': '10', + 's': '2', + 'f[]': '-1', + 'nm': keyword} + + response = self.makeRequest(url, data=data) + if None != response and 0 < len(response): + response = response.decode('cp1251').encode('utf8') + #print response + if not self.check_login(response): + response = self.makeRequest(url, data=data) + response = response.decode('cp1251').encode('utf8') + #print response + forums = [7, 187, 2090, 2221, 2091, 2092, 2093, 934, 505, 212, 2459, 1235, 185, 22, 941, 1666, 124, 1543, + 376, 709, 1577, 511, 656, 93, 905, 1576, 101, 100, 103, 572, 1670, 2198, 2199, 313, 2201, 312, + 2339, 314, 352, 549, 1213, 2109, 514, 2097, 4, 930, 2365, 1900, 521, 2258, 208, 539, 209, 484, + 822, 921, 922, 1247, 923, 924, 1991, 925, 1165, 1245, 928, 926, 1246, 1250, 927, 1248, 33, 281, + 1386, 1387, 1388, 282, 599, 1105, 1389, 404, 1390, 1642, 1391, 893, 1478, 670, 2107, 294, 1453, + 1475, 46, 2178, 671, 2177, 251, 97, 851, 821, 2076, 98, 56, 1469, 2123, 1280, 876, 752, 1114, + 2380, 1467, 672, 249, 552, 500, 2112, 1327, 1468, 24, 1959, 115, 939, 1481, 113, 882, 1482, 393, + 1569, 373, 1186, 137, 1321, 532, 979, 827, 1484, 1485, 114, 1332, 1495, 255, 256, 1986, 1551, 626, + 262, 1326, 978, 1287, 1188, 1667, 1675, 257, 845, 875, 263, 2073, 550, 2124, 1470, 528, 486, 854, + 2079, 260, 2111, 1608, 1952, 1613, 1614, 1623, 1615, 1630, 2514, 1616, 2014, 1617, 1987, 2171, + 1620, 1621, 1998, 751, 1697, 2004, 2001, 2002, 283, 1997, 2003, 2009, 2010, 2006, 2007, 2005, 259, + 2008, 126, 9, 104, 1535, 91, 1356, 856, 188, 1408, 310, 202, 935, 990, 80, 119, 1530, 175, 79, + 172, 812, 207, 805, 123, 189, 271, 273, 743, 184, 842, 194, 1605, 85, 1144, 595, 1288, 1171, 1694, + 1690, 820, 819, 625, 84, 242, 623, 1417, 1798, 106, 166, 236, 507, 504, 536, 173, 918, 920, 203, + 1243, 1120, 140, 636, 606, 776, 235, 1499, 81, 266, 252, 1102, 1449, 196, 372, 110, 193, 1531, + 237, 265, 181, 1214, 497, 121, 721, 1117, 1359, 387, 134, 195, 2366, 2390, 2391, 2392, 2407, 2393, + 2370, 2394, 2408, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 911, + 1691, 704, 1493, 1500, 1574, 1940, 1539, 1939, 823, 1006, 972, 1299, 781, 717, 1300, 1803, 1298, + 825, 1606, 1458, 1463, 1459, 1938, 1461, 718, 1498, 907, 877, 992, 607, 594, 775, 534, 1462, 904, + 1460, 816, 815, 325, 1457, 1301, 1692, 1540, 694, 1949, 1678, 1541, 860, 1941, 1537, 2100, 2102, + 2103, 1242, 2104, 610, 1542, 2335, 1544, 1545, 1546, 1549, 1597, 1552, 1550, 1568, 1553, 1554, + 617, 1555, 2017, 1257, 1258, 2208, 677, 1255, 1479, 1261, 614, 1259, 2065, 1254, 1260, 2209, 2210, + 1547, 1548, 2211, 615, 1581, 1590, 1587, 1594, 1591, 1588, 1596, 1585, 1586, 2078, 1929, 1593, + 1592, 1595, 1556, 1560, 1561, 1653, 1570, 1654, 1655, 1656, 1930, 1931, 1932, 1562, 1563, 1626, + 1564, 1565, 1559, 1566, 1573, 1567] + for (forum, link, title, size, seeds, leechers) in re.compile( + '.+? class=".+?" href="\./viewtopic\.php\?t=(\d+)">(.+?).+?(.+?) &.+?(.+?).+?(\d+)', + re.DOTALL).findall(response): + if int(forum) in forums: + size = size.replace(' ', ' ') + torrentTitle = title + image = sys.modules["__main__"].__root__ + self.searchIcon + link = 'http://dl.rutracker.org/forum/dl.php?t=' + link + filesList.append(( + int(int(self.sourceWeight) * int(seeds)), + int(seeds), int(leechers), size, + self.unescape(self.stripHtml(torrentTitle)), + self.__class__.__name__ + '::' + link, + image, + )) + return filesList + + def getTorrentFile(self, url): + self.load_cookie() + cookie=None + for cookie in self.cookieJar: + if cookie.name=='bb_data' and cookie.domain=='.rutracker.org': + cookie = 'bb_data=' + cookie.value + '; bb_dl=' + re.search('(\d+)$',url).group(1) + break + if not cookie: + cookie = self.login() + '; bb_dl=' + re.search('(\d+)$',url).group(1) + + referer = 'http://rutracker.org/forum/viewtopic.php?t=' + re.search('(\d+)$', url).group(1) + headers=[('Cookie', cookie), ('Referer', referer)] + content = self.makeRequest(url, headers=headers) + if not self.check_login(content): + cookie = self.login() + '; bb_dl=' + re.search('(\d+)$',url).group(1) + content = self.makeRequest(url, headers=[('Cookie', cookie), ('Referer', referer)]) + + return self.saveTorrentFile(url, content) + + def check_login(self, response=None): + if None != response and 0 < len(response): + if re.compile('. +''' + +import re +import os +import urllib +import tempfile +import sys + +import SearcherABC + + +class TFileME(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/TFileME.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return False + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + ))''' + + def search(self, keyword): + filesList = [] + url='http://tfile.me/forum/ssearch.php?q=%s' % urllib.quote_plus(keyword.decode('utf-8').encode('cp1251')) + url+='&c=2&f=4&f=1488&f=1379&f=1225&f=1331&f=1248&f=1197&f=1026&f=293&f=1227&f=577&f=298&f=297&f=290&f=299&f=230&f=303&f=292&f=1240&f=304&f=296&f=300&f=1332&f=1324&f=691&f=301&f=294&f=1241&f=498&f=367&f=574&f=1226&f=295&f=189&f=1525&f=1224&f=1388&f=1387&f=1276&f=1889&f=1917&f=1907&f=1908&f=1909&f=1910&f=1911&f=1890&f=1891&f=1892&f=1893&f=1912&f=1899&f=1894&f=1895&f=1903&f=1896&f=1897&f=1898&f=1900&f=1902&f=1901&f=1904&f=1905&f=1906&f=1913&f=15&f=1918&f=1374&f=1946&f=1579&f=1947&f=1242&f=1508&f=1165&f=1166&f=1245&f=1158&f=532&f=1167&f=1159&f=1244&f=1160&f=1173&f=1238&f=1678&f=1161&f=1320&f=1162&f=1246&f=496&f=1164&f=1163&f=1172&f=1243&f=1386&f=1312&f=1536&f=1919&f=1577&f=1989&f=1578&f=1554&f=1537&f=1538&f=1539&f=1540&f=1541&f=1542&f=1543&f=1555&f=1680&f=1544&f=1556&f=1545&f=1546&f=1547&f=1848&f=1548&f=1550&f=1620&f=1920&f=193&f=1968&f=1237&f=1420&f=1036&f=449&f=448&f=447&f=537&f=1170&f=37&f=1921&f=1323&f=1252&f=1685&f=697&f=172&f=311&f=183&f=130&f=1024&f=139&f=1023&f=179&f=392&f=308&f=342&f=1612&f=1015&f=96&f=353&f=997&f=285&f=154&f=1613&f=975&f=168&f=1849&f=1020&f=265&f=123&f=1614&f=1615&f=117&f=155&f=1611&f=1616&f=1617&f=152&f=105&f=312&f=127&f=1030&f=150&f=328&f=305&f=149&f=136&f=134&f=158&f=169&f=1421&f=768&f=767&f=309&f=377&f=1017&f=1590&f=1923&f=1591&f=1966&f=1592&f=1607&f=1593&f=1594&f=1595&f=1596&f=1597&f=1598&f=1599&f=1600&f=1844&f=1601&f=1602&f=1603&f=1604&f=1605&f=1681&f=17&f=1924&f=1415&f=1964&f=1416&f=1304&f=1146&f=1147&f=1156&f=1534&f=1142&f=29&f=85&f=1514&f=1148&f=1515&f=384&f=216&f=1149&f=232&f=1535&f=506&f=1517&f=1516&f=1000&f=1518&f=237&f=243&f=1150&f=244&f=239&f=197&f=236&f=1151&f=235&f=1152&f=234&f=1153&f=1018&f=1143&f=1563&f=1925&f=1564&f=1565&f=1566&f=1567&f=1568&f=1569&f=1570&f=1571&f=1572&f=1574&f=1575&f=1576&f=1926&f=175&f=1881&f=1256&f=1145&f=1140&f=1253&f=1157&f=727&f=1551&f=567&f=1254&f=219&f=568&f=974&f=495&f=743&f=494&f=401&f=731&f=499&f=500&f=538&f=206&f=1040&f=446&f=1005&f=210&f=203&f=207&f=204&f=1255&f=202&f=1141&f=16&f=1927&f=1380&f=1425&f=1438&f=1333&f=187&f=1062&f=1310&f=1059&f=1033&f=1509&f=1193&f=1195&f=1064&f=1063&f=1028&f=1058&f=1019&f=490&f=1397&f=1065&f=1419&f=1194&f=1070&f=274&f=1383&f=1334&f=1067&f=1068&f=1066&f=1069&f=1060&f=1282&f=19&f=1915&f=1872&f=1922&f=1284&f=1294&f=1301&f=1288&f=1291&f=1309&f=39&f=1285&f=1290&f=1306&f=1295&f=1300&f=1302&f=1287&f=1307&f=1292&f=1299&f=1297&f=1293&f=1888&f=1286&f=1298&f=1296&f=1519&f=1303&f=1527&g=&act=&y=&ql=&a=&d=&o=&size_min=0&size_max=0' + headers = {('Origin', 'http://tfile.me'), + ('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://tfile.me/')} + + response = self.makeRequest(url, headers=headers) + if None != response and 0 < len(response): + response = response.decode('cp1251').encode('utf-8') + self.cookieJar.save(ignore_discard=True) + #self.check_login(response) + #print response + #bad_forums = [2,1,23,32,40,41] + regex = '''.+?(.+?).+?(.+?).+?class="sd">(\d+).+?class="lc">(\d+)''' + for (forum, title, link, size, seeds, leechers) in re.compile(regex, re.DOTALL).findall(response): + #if int(forum) not in bad_forums: + title=self.clear_title(title) + image = sys.modules["__main__"].__root__ + self.searchIcon + link = 'http://tfile.me/forum/download.php?id='+link + filesList.append(( + int(int(self.sourceWeight) * int(seeds)), + int(seeds), int(leechers), size, + title, + self.__class__.__name__ + '::' + link, + image, + )) + return filesList + + def clear_title(self, s): + return self.stripHtml(self.unescape(s)).replace(' ',' ').replace(' ',' ').strip() + + def check_login(self, response=None): + if None != response and 0 < len(response): + #print response + if re.compile('. +''' + +import urllib +import re +import sys +import urllib2 + +import SearcherABC + + +class ThePirateBaySe(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/thepiratebay.se.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return True + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + )) + ''' + + def search(self, keyword): + filesList = [] + url = "http://thepiratebay.se/search/%s/0/99/200" % (urllib.quote_plus(keyword)) + + response = self.makeRequest(url) + + if None != response and 0 < len(response): + #print response + dat = re.compile( + r'

    .+?">(.+?).+?Uploaded .+?, Size (.+?), .+?.+?(\d+?).+?(\d+?)', + re.DOTALL).findall(response) + for (title, link, size, seeds, leechers) in dat: + torrentTitle = title #"%s [S\L: %s\%s]" % (title, seeds, leechers) + size = size.replace(' ', ' ') + image = sys.modules["__main__"].__root__ + self.searchIcon + if not re.match('^https?\://.+', link) and not re.match('^magnet\:.+', link): + link = re.search('^(https?\://.+?)/.+', url).group(1) + link + filesList.append(( + int(int(self.sourceWeight) * int(seeds)), + int(seeds), int(leechers), size, + self.unescape(self.stripHtml(torrentTitle)), + self.__class__.__name__ + '::' + link, + image, + )) + return filesList \ No newline at end of file diff --git a/resources/searchers/ThePirateBaySe.pyo b/resources/searchers/ThePirateBaySe.pyo new file mode 100644 index 0000000000000000000000000000000000000000..587b6881e1d8afda4e8fd65f99b2700ce9ff53b0 GIT binary patch literal 3150 zcmcgu&u<&Y6@E*K)KABD97he176SndC|DpJ9PM+PdVg}Tifr=l9pYx&CQf{IP+%az3=__-m>`Xot1x_{H+zz>{G<| z*LX|^Lqv3e(W9t9u}2q}f@1-e+6&r5VsqNqr+M3*J%;o<`QO!O1c z`9+yEHY+7I^h<$gMc~s)wU&vMT4eF4uM*KqwfJuT<$>EhNVBn4{ecyggH5sh`15V? zZ4jxUXkMkd8@MyqET|eM__{v~R9p?y;YzN3pp3|L+SkEQVA|7C3X}HiO`zqD7^fo< z28qxzQpRf49a$-q6+sf!0ArX&syB9uARHwTP}+eMKsz)d?YYG_jZ^WBOr#ECaWd-0 zDip^ml!=idfNhqTfs8~qSH$<9Gm7R6g?OGqb6{1PYze8buf?_025a%f+{jGhmPoaO zQwc1C*CNgM;wBJ}MI3M#XLqaa+SQpYQ1=M+7k7~xj3u)e!bB;{|cw=AjPh{mbor9%wh$H5n>%Ab_^e!ikHv)gBQ3{ z-#iDHh>pLVh~(QBs!Gp8sGvEqO|7W{ojh6-5^erzH<~%ZVL+Nj(Q?V z?Upb=xjV2n+o{!VZf>gmWK>OczlLhyN-(v(>WcaoJ`MW;%D**`CrTq-`@y&=-_Q`8 zpnYb?HU>6mUH-~uxX{9;alo1m2A*To|FGiG5YXV#f?#6g)FR7xn{a=^$y zhg@i&#B~d5J2IJ*i@- zX_+H1wYgzaQ(>Bz8Zw)?Ky-s~)yQg=^h3Tke-2p30tQRy94u|P(XyxS1BsfCzopu%N<&ut~vc5 zP_#%BXJt+QHW$I(JEFT3Ej#$Ya*v`F28$ExFrL5{NbeJZhJW_-0dMnsnI|8;y)~E+89(k{?=q$I^tgIpI4YP@H#?k+%yIEb< z{%mTGYhQj@+kX65;V_xMW7v(Y-pt8Sane}M6XAwl^t-&SXMa9ifbYSoXAow%p)UW{Wm*D{NPFu!fa#>wz{9>vg|JEzmsb~+A5 z&ebDy7;u7N*l^&K=NnGg*Xby8!XV3J5;{Cb{diTBig$l>f|04#MOq8w5GXl)D(&Px# literal 0 HcmV?d00001 diff --git a/resources/searchers/icons/EZTV.png b/resources/searchers/icons/EZTV.png new file mode 100644 index 0000000000000000000000000000000000000000..615085333a6c935891a6772c44ae41246b163c49 GIT binary patch literal 112684 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 z�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 literal 0 HcmV?d00001 diff --git a/resources/searchers/icons/KickAssSo.png b/resources/searchers/icons/KickAssSo.png new file mode 100644 index 0000000000000000000000000000000000000000..c0050cec49ee21a8a2cd6de8f784b880c9ea1d4c GIT binary patch literal 27220 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 literal 0 HcmV?d00001 diff --git a/resources/searchers/icons/KinoZalTV.png b/resources/searchers/icons/KinoZalTV.png new file mode 100644 index 0000000000000000000000000000000000000000..aa48b4fa6d9888a0fdc3e03c504a48c917fd10a7 GIT binary patch literal 31350 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 literal 0 HcmV?d00001 diff --git a/resources/searchers/icons/Nyaa.png b/resources/searchers/icons/Nyaa.png new file mode 100644 index 0000000000000000000000000000000000000000..3848b4af20c5742e20a83cf220c1a89651dc623c GIT binary patch literal 104468 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¥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�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 literal 0 HcmV?d00001 diff --git a/resources/searchers/icons/OpenSharing.png b/resources/searchers/icons/OpenSharing.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ea97936382209b450f4c30856fda64f30a8330 GIT binary patch literal 44678 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

    dYCAIXGBYkAgci|JL!FJO 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 literal 0 HcmV?d00001 diff --git a/resources/searchers/icons/rutor.org.png b/resources/searchers/icons/rutor.org.png new file mode 100644 index 0000000000000000000000000000000000000000..07d7d154bc6d21182f0c344410fd8309f854d910 GIT binary patch literal 60219 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 BL2Up4 literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/class_defs.pyo b/resources/utorrent/dopal/class_defs.pyo new file mode 100644 index 0000000000000000000000000000000000000000..94e82d90c35010e4dc9f82e2329b7029a4869510 GIT binary patch literal 173205 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 C>-#tW literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/classes.py b/resources/utorrent/dopal/classes.py new file mode 100644 index 0000000..d564beb --- /dev/null +++ b/resources/utorrent/dopal/classes.py @@ -0,0 +1,317 @@ +# File: classes.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +''' +Contains basic class definitions for objects - use this module when doing +instance checking. + +This module contains a few utility functions in determining what classes are supported by DOPAL - it has an internal list of all classes that DOPAL is aware of. +''' + +from dopal.aztypes import get_component_type as _get_component_type + +# +# List of classes created by classes_make.py. +# +azureus_class_list = [ + ('org.gudy.azureus2.plugins', 'LaunchablePlugin'), + ('org.gudy.azureus2.plugins', 'Plugin'), + ('org.gudy.azureus2.plugins', 'PluginConfig'), + ('org.gudy.azureus2.plugins', 'PluginConfigListener'), + ('org.gudy.azureus2.plugins', 'PluginEvent'), + ('org.gudy.azureus2.plugins', 'PluginEventListener'), + ('org.gudy.azureus2.plugins', 'PluginInterface'), + ('org.gudy.azureus2.plugins', 'PluginListener'), + ('org.gudy.azureus2.plugins', 'PluginManager'), + ('org.gudy.azureus2.plugins', 'PluginManagerArgumentHandler'), + ('org.gudy.azureus2.plugins', 'PluginManagerDefaults'), + ('org.gudy.azureus2.plugins', 'UnloadablePlugin'), + ('org.gudy.azureus2.plugins.clientid', 'ClientIDGenerator'), + ('org.gudy.azureus2.plugins.clientid', 'ClientIDManager'), + ('org.gudy.azureus2.plugins.config', 'ConfigParameter'), + ('org.gudy.azureus2.plugins.config', 'ConfigParameterListener'), + ('org.gudy.azureus2.plugins.ddb', 'DistributedDatabase'), + ('org.gudy.azureus2.plugins.ddb', 'DistributedDatabaseContact'), + ('org.gudy.azureus2.plugins.ddb', 'DistributedDatabaseEvent'), + ('org.gudy.azureus2.plugins.ddb', 'DistributedDatabaseKey'), + ('org.gudy.azureus2.plugins.ddb', 'DistributedDatabaseListener'), + ('org.gudy.azureus2.plugins.ddb', 'DistributedDatabaseProgressListener'), + ('org.gudy.azureus2.plugins.ddb', 'DistributedDatabaseTransferHandler'), + ('org.gudy.azureus2.plugins.ddb', 'DistributedDatabaseTransferType'), + ('org.gudy.azureus2.plugins.ddb', 'DistributedDatabaseValue'), + ('org.gudy.azureus2.plugins.disk', 'DiskManager'), + ('org.gudy.azureus2.plugins.disk', 'DiskManagerChannel'), + ('org.gudy.azureus2.plugins.disk', 'DiskManagerEvent'), + ('org.gudy.azureus2.plugins.disk', 'DiskManagerFileInfo'), + ('org.gudy.azureus2.plugins.disk', 'DiskManagerListener'), + ('org.gudy.azureus2.plugins.disk', 'DiskManagerRequest'), + ('org.gudy.azureus2.plugins.download', 'Download'), + ('org.gudy.azureus2.plugins.download', 'DownloadAnnounceResult'), + ('org.gudy.azureus2.plugins.download', 'DownloadAnnounceResultPeer'), + ('org.gudy.azureus2.plugins.download', 'DownloadListener'), + ('org.gudy.azureus2.plugins.download', 'DownloadManager'), + ('org.gudy.azureus2.plugins.download', 'DownloadManagerListener'), + ('org.gudy.azureus2.plugins.download', 'DownloadManagerStats'), + ('org.gudy.azureus2.plugins.download', 'DownloadPeerListener'), + ('org.gudy.azureus2.plugins.download', 'DownloadPropertyEvent'), + ('org.gudy.azureus2.plugins.download', 'DownloadPropertyListener'), + ('org.gudy.azureus2.plugins.download', 'DownloadScrapeResult'), + ('org.gudy.azureus2.plugins.download', 'DownloadStats'), + ('org.gudy.azureus2.plugins.download', 'DownloadTrackerListener'), + ('org.gudy.azureus2.plugins.download', 'DownloadWillBeAddedListener'), + ('org.gudy.azureus2.plugins.download', 'DownloadWillBeRemovedListener'), + ('org.gudy.azureus2.plugins.download.session', 'SessionAuthenticator'), + ('org.gudy.azureus2.plugins.installer', 'FilePluginInstaller'), + ('org.gudy.azureus2.plugins.installer', 'InstallablePlugin'), + ('org.gudy.azureus2.plugins.installer', 'PluginInstaller'), + ('org.gudy.azureus2.plugins.installer', 'PluginInstallerListener'), + ('org.gudy.azureus2.plugins.installer', 'StandardPlugin'), + ('org.gudy.azureus2.plugins.ipc', 'IPCInterface'), + ('org.gudy.azureus2.plugins.ipfilter', 'IPBlocked'), + ('org.gudy.azureus2.plugins.ipfilter', 'IPFilter'), + ('org.gudy.azureus2.plugins.ipfilter', 'IPRange'), + ('org.gudy.azureus2.plugins.logging', 'Logger'), + ('org.gudy.azureus2.plugins.logging', 'LoggerAlertListener'), + ('org.gudy.azureus2.plugins.logging', 'LoggerChannel'), + ('org.gudy.azureus2.plugins.logging', 'LoggerChannelListener'), + ('org.gudy.azureus2.plugins.messaging', 'Message'), + ('org.gudy.azureus2.plugins.messaging', 'MessageManager'), + ('org.gudy.azureus2.plugins.messaging', 'MessageManagerListener'), + ('org.gudy.azureus2.plugins.messaging', 'MessageStreamDecoder'), + ('org.gudy.azureus2.plugins.messaging', 'MessageStreamEncoder'), + ('org.gudy.azureus2.plugins.network', 'Connection'), + ('org.gudy.azureus2.plugins.network', 'ConnectionListener'), + ('org.gudy.azureus2.plugins.network', 'ConnectionManager'), + ('org.gudy.azureus2.plugins.network', 'IncomingMessageQueue'), + ('org.gudy.azureus2.plugins.network', 'IncomingMessageQueueListener'), + ('org.gudy.azureus2.plugins.network', 'OutgoingMessageQueue'), + ('org.gudy.azureus2.plugins.network', 'OutgoingMessageQueueListener'), + ('org.gudy.azureus2.plugins.network', 'RawMessage'), + ('org.gudy.azureus2.plugins.network', 'Transport'), + ('org.gudy.azureus2.plugins.peers', 'Peer'), + ('org.gudy.azureus2.plugins.peers', 'PeerEvent'), + ('org.gudy.azureus2.plugins.peers', 'PeerListener'), + ('org.gudy.azureus2.plugins.peers', 'PeerListener2'), + ('org.gudy.azureus2.plugins.peers', 'PeerManager'), + ('org.gudy.azureus2.plugins.peers', 'PeerManagerListener'), + ('org.gudy.azureus2.plugins.peers', 'PeerManagerStats'), + ('org.gudy.azureus2.plugins.peers', 'PeerReadRequest'), + ('org.gudy.azureus2.plugins.peers', 'PeerStats'), + ('org.gudy.azureus2.plugins.peers.protocol', 'PeerProtocolBT'), + ('org.gudy.azureus2.plugins.peers.protocol', 'PeerProtocolExtensionHandler'), + ('org.gudy.azureus2.plugins.peers.protocol', 'PeerProtocolManager'), + ('org.gudy.azureus2.plugins.platform', 'PlatformManager'), + ('org.gudy.azureus2.plugins.sharing', 'ShareItem'), + ('org.gudy.azureus2.plugins.sharing', 'ShareManager'), + ('org.gudy.azureus2.plugins.sharing', 'ShareManagerListener'), + ('org.gudy.azureus2.plugins.sharing', 'ShareResource'), + ('org.gudy.azureus2.plugins.sharing', 'ShareResourceDir'), + ('org.gudy.azureus2.plugins.sharing', 'ShareResourceDirContents'), + ('org.gudy.azureus2.plugins.sharing', 'ShareResourceEvent'), + ('org.gudy.azureus2.plugins.sharing', 'ShareResourceFile'), + ('org.gudy.azureus2.plugins.sharing', 'ShareResourceListener'), + ('org.gudy.azureus2.plugins.sharing', 'ShareResourceWillBeDeletedListener'), + ('org.gudy.azureus2.plugins.torrent', 'Torrent'), + ('org.gudy.azureus2.plugins.torrent', 'TorrentAnnounceURLList'), + ('org.gudy.azureus2.plugins.torrent', 'TorrentAnnounceURLListSet'), + ('org.gudy.azureus2.plugins.torrent', 'TorrentAttribute'), + ('org.gudy.azureus2.plugins.torrent', 'TorrentAttributeEvent'), + ('org.gudy.azureus2.plugins.torrent', 'TorrentAttributeListener'), + ('org.gudy.azureus2.plugins.torrent', 'TorrentDownloader'), + ('org.gudy.azureus2.plugins.torrent', 'TorrentFile'), + ('org.gudy.azureus2.plugins.torrent', 'TorrentManager'), + ('org.gudy.azureus2.plugins.torrent', 'TorrentManagerEvent'), + ('org.gudy.azureus2.plugins.torrent', 'TorrentManagerListener'), + ('org.gudy.azureus2.plugins.tracker', 'Tracker'), + ('org.gudy.azureus2.plugins.tracker', 'TrackerListener'), + ('org.gudy.azureus2.plugins.tracker', 'TrackerPeer'), + ('org.gudy.azureus2.plugins.tracker', 'TrackerPeerEvent'), + ('org.gudy.azureus2.plugins.tracker', 'TrackerPeerListener'), + ('org.gudy.azureus2.plugins.tracker', 'TrackerTorrent'), + ('org.gudy.azureus2.plugins.tracker', 'TrackerTorrentListener'), + ('org.gudy.azureus2.plugins.tracker', 'TrackerTorrentRequest'), + ('org.gudy.azureus2.plugins.tracker', 'TrackerTorrentWillBeRemovedListener'), + ('org.gudy.azureus2.plugins.tracker.web', 'TrackerAuthenticationListener'), + ('org.gudy.azureus2.plugins.tracker.web', 'TrackerWebContext'), + ('org.gudy.azureus2.plugins.tracker.web', 'TrackerWebPageGenerator'), + ('org.gudy.azureus2.plugins.tracker.web', 'TrackerWebPageRequest'), + ('org.gudy.azureus2.plugins.tracker.web', 'TrackerWebPageResponse'), + ('org.gudy.azureus2.plugins.ui', 'Graphic'), + ('org.gudy.azureus2.plugins.ui', 'UIInstance'), + ('org.gudy.azureus2.plugins.ui', 'UIInstanceFactory'), + ('org.gudy.azureus2.plugins.ui', 'UIManager'), + ('org.gudy.azureus2.plugins.ui', 'UIManagerEvent'), + ('org.gudy.azureus2.plugins.ui', 'UIManagerEventListener'), + ('org.gudy.azureus2.plugins.ui', 'UIManagerListener'), + ('org.gudy.azureus2.plugins.ui', 'UIPluginView'), + ('org.gudy.azureus2.plugins.ui.components', 'UIComponent'), + ('org.gudy.azureus2.plugins.ui.components', 'UIProgressBar'), + ('org.gudy.azureus2.plugins.ui.components', 'UIPropertyChangeEvent'), + ('org.gudy.azureus2.plugins.ui.components', 'UIPropertyChangeListener'), + ('org.gudy.azureus2.plugins.ui.components', 'UITextArea'), + ('org.gudy.azureus2.plugins.ui.components', 'UITextField'), + ('org.gudy.azureus2.plugins.ui.config', 'ActionParameter'), + ('org.gudy.azureus2.plugins.ui.config', 'BooleanParameter'), + ('org.gudy.azureus2.plugins.ui.config', 'ConfigSection'), + ('org.gudy.azureus2.plugins.ui.config', 'ConfigSectionSWT'), + ('org.gudy.azureus2.plugins.ui.config', 'DirectoryParameter'), + ('org.gudy.azureus2.plugins.ui.config', 'EnablerParameter'), + ('org.gudy.azureus2.plugins.ui.config', 'IntParameter'), + ('org.gudy.azureus2.plugins.ui.config', 'LabelParameter'), + ('org.gudy.azureus2.plugins.ui.config', 'Parameter'), + ('org.gudy.azureus2.plugins.ui.config', 'ParameterGroup'), + ('org.gudy.azureus2.plugins.ui.config', 'ParameterListener'), + ('org.gudy.azureus2.plugins.ui.config', 'PasswordParameter'), + ('org.gudy.azureus2.plugins.ui.config', 'PluginConfigUIFactory'), + ('org.gudy.azureus2.plugins.ui.config', 'StringListParameter'), + ('org.gudy.azureus2.plugins.ui.config', 'StringParameter'), + ('org.gudy.azureus2.plugins.ui.menus', 'MenuItem'), + ('org.gudy.azureus2.plugins.ui.menus', 'MenuItemFillListener'), + ('org.gudy.azureus2.plugins.ui.menus', 'MenuItemListener'), + ('org.gudy.azureus2.plugins.ui.model', 'BasicPluginConfigModel'), + ('org.gudy.azureus2.plugins.ui.model', 'BasicPluginViewModel'), + ('org.gudy.azureus2.plugins.ui.model', 'PluginConfigModel'), + ('org.gudy.azureus2.plugins.ui.model', 'PluginViewModel'), + ('org.gudy.azureus2.plugins.ui.SWT', 'GraphicSWT'), + ('org.gudy.azureus2.plugins.ui.SWT', 'SWTManager'), + ('org.gudy.azureus2.plugins.ui.tables', 'TableCell'), + ('org.gudy.azureus2.plugins.ui.tables', 'TableCellAddedListener'), + ('org.gudy.azureus2.plugins.ui.tables', 'TableCellDisposeListener'), + ('org.gudy.azureus2.plugins.ui.tables', 'TableCellMouseListener'), + ('org.gudy.azureus2.plugins.ui.tables', 'TableCellRefreshListener'), + ('org.gudy.azureus2.plugins.ui.tables', 'TableCellToolTipListener'), + ('org.gudy.azureus2.plugins.ui.tables', 'TableColumn'), + ('org.gudy.azureus2.plugins.ui.tables', 'TableContextMenuItem'), + ('org.gudy.azureus2.plugins.ui.tables', 'TableManager'), + ('org.gudy.azureus2.plugins.ui.tables', 'TableRow'), + ('org.gudy.azureus2.plugins.ui.tables.mytorrents', 'MyTorrentsTableItem'), + ('org.gudy.azureus2.plugins.ui.tables.mytorrents', 'PluginMyTorrentsItem'), + ('org.gudy.azureus2.plugins.ui.tables.mytorrents', 'PluginMyTorrentsItemFactory'), + ('org.gudy.azureus2.plugins.ui.tables.peers', 'PeerTableItem'), + ('org.gudy.azureus2.plugins.ui.tables.peers', 'PluginPeerItem'), + ('org.gudy.azureus2.plugins.ui.tables.peers', 'PluginPeerItemFactory'), + ('org.gudy.azureus2.plugins.update', 'UpdatableComponent'), + ('org.gudy.azureus2.plugins.update', 'Update'), + ('org.gudy.azureus2.plugins.update', 'UpdateChecker'), + ('org.gudy.azureus2.plugins.update', 'UpdateCheckerListener'), + ('org.gudy.azureus2.plugins.update', 'UpdateCheckInstance'), + ('org.gudy.azureus2.plugins.update', 'UpdateCheckInstanceListener'), + ('org.gudy.azureus2.plugins.update', 'UpdateInstaller'), + ('org.gudy.azureus2.plugins.update', 'UpdateListener'), + ('org.gudy.azureus2.plugins.update', 'UpdateManager'), + ('org.gudy.azureus2.plugins.update', 'UpdateManagerDecisionListener'), + ('org.gudy.azureus2.plugins.update', 'UpdateManagerListener'), + ('org.gudy.azureus2.plugins.update', 'UpdateProgressListener'), + ('org.gudy.azureus2.plugins.utils', 'AggregatedDispatcher'), + ('org.gudy.azureus2.plugins.utils', 'AggregatedList'), + ('org.gudy.azureus2.plugins.utils', 'AggregatedListAcceptor'), + ('org.gudy.azureus2.plugins.utils', 'ByteArrayWrapper'), + ('org.gudy.azureus2.plugins.utils', 'Formatters'), + ('org.gudy.azureus2.plugins.utils', 'LocaleDecoder'), + ('org.gudy.azureus2.plugins.utils', 'LocaleListener'), + ('org.gudy.azureus2.plugins.utils', 'LocaleUtilities'), + ('org.gudy.azureus2.plugins.utils', 'Monitor'), + ('org.gudy.azureus2.plugins.utils', 'PooledByteBuffer'), + ('org.gudy.azureus2.plugins.utils', 'Semaphore'), + ('org.gudy.azureus2.plugins.utils', 'ShortCuts'), + ('org.gudy.azureus2.plugins.utils', 'Utilities'), + ('org.gudy.azureus2.plugins.utils', 'UTTimer'), + ('org.gudy.azureus2.plugins.utils', 'UTTimerEvent'), + ('org.gudy.azureus2.plugins.utils', 'UTTimerEventPerformer'), + ('org.gudy.azureus2.plugins.utils.resourcedownloader', 'ResourceDownloader'), + ('org.gudy.azureus2.plugins.utils.resourcedownloader', 'ResourceDownloaderDelayedFactory'), + ('org.gudy.azureus2.plugins.utils.resourcedownloader', 'ResourceDownloaderFactory'), + ('org.gudy.azureus2.plugins.utils.resourcedownloader', 'ResourceDownloaderListener'), + ('org.gudy.azureus2.plugins.utils.resourceuploader', 'ResourceUploader'), + ('org.gudy.azureus2.plugins.utils.resourceuploader', 'ResourceUploaderFactory'), + ('org.gudy.azureus2.plugins.utils.security', 'CertificateListener'), + ('org.gudy.azureus2.plugins.utils.security', 'PasswordListener'), + ('org.gudy.azureus2.plugins.utils.security', 'SESecurityManager'), + ('org.gudy.azureus2.plugins.utils.xml.rss', 'RSSChannel'), + ('org.gudy.azureus2.plugins.utils.xml.rss', 'RSSFeed'), + ('org.gudy.azureus2.plugins.utils.xml.rss', 'RSSItem'), + ('org.gudy.azureus2.plugins.utils.xml.simpleparser', 'SimpleXMLParserDocument'), + ('org.gudy.azureus2.plugins.utils.xml.simpleparser', 'SimpleXMLParserDocumentAttribute'), + ('org.gudy.azureus2.plugins.utils.xml.simpleparser', 'SimpleXMLParserDocumentFactory'), + ('org.gudy.azureus2.plugins.utils.xml.simpleparser', 'SimpleXMLParserDocumentNode'), +] + +# Record the existance of the classes which are mentioned above. +# (We need this for lookups.) +_known_class_names = dict([(cls_tpl[1], None) for cls_tpl in azureus_class_list]).keys() + +import dopal + +if dopal.__dopal_mode__ == 1: + # Check we don't get any nameclashes. + if len(azureus_class_list) != len(_known_class_names): + raise RuntimeError, 'difference in class sizes' + +# We do more to generate a nice docstring in epydoc mode. +if dopal.__dopal_mode__ == 2: + grouped_classes = {} + for package_name, class_name in azureus_class_list: + grouped_classes.setdefault(package_name, []).append(class_name) + + ordered_grouped_packages = grouped_classes.keys() + ordered_grouped_packages.sort() + + generated_lines = [] + + base_url = 'http://azureus.sourceforge.net/plugins/docCVS/' + package_tmpl = base_url + '%s/package-summary.html' + class_tmpl = base_url + '%s/%s.html' + for package_name in ordered_grouped_packages: + package_path = package_name.replace('.', '/') + full_package_url = package_tmpl % package_path + generated_lines.append( + '\n - Package C{U{%(package_name)s<%(full_package_url)s>}}' % vars() + ) + for class_name in grouped_classes[package_name]: + full_class_url = class_tmpl % (package_path, class_name) + generated_lines.append( + ' - Class C{U{%(class_name)s<%(full_class_url)s>}}' % vars() + ) + + __doc__ += "\n\nThe following classes are well-supported by DOPAL (the " + __doc__ += 'links below link to the Azureus\'s own ' + __doc__ += 'U{Javadoc API documentation<%(base_url)s>}):\n' % vars() + __doc__ += '\n'.join(generated_lines) + + del package_path, full_package_url, full_class_url + del base_url, package_tmpl, class_tmpl + del package_name, class_name, generated_lines + del grouped_classes, ordered_grouped_packages +del azureus_class_list + + +def is_azureus_class(class_name): + return class_name in _known_class_names + + +is_azureus_argument_class = is_azureus_class + + +def is_azureus_return_class(class_name): + if is_azureus_class(class_name): + return True + + class_component_type = _get_component_type(class_name) + if class_component_type is not None: + if is_azureus_class(class_name): + return True + + return False diff --git a/resources/utorrent/dopal/classes.pyc b/resources/utorrent/dopal/classes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38114f425d74f6f6ef657e4e969fca589fae40c7 GIT binary patch literal 20761 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 Ywe){?2TRw%hQdlve>(~*J30&h4fYO^?EnA( literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/convert.py b/resources/utorrent/dopal/convert.py new file mode 100644 index 0000000..9867178 --- /dev/null +++ b/resources/utorrent/dopal/convert.py @@ -0,0 +1,518 @@ +# File: convert.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +''' +Contains classes used to convert an XML structure back into an object +structure. +''' + +# We disable the override checks (subclasses of mixins are allowed to have +# different signatures - arguments they want can be explicitly named, arguments +# they don't want can be left unnamed in kwargs). +# +# We also disable the class attribute checks - converter calls a lot of methods +# which are only defined in mixin classes. +__pychecker__ = 'unusednames=attributes,kwargs,object_id,value,self no-override no-classattr no-objattr' + +import types + +from dopal.aztypes import is_array_type, get_component_type, \ + is_java_argument_type, is_java_return_type +from dopal.classes import is_azureus_argument_class, is_azureus_return_class +from dopal.errors import AbortConversion, DelayConversion, SkipConversion +from dopal.utils import Sentinel + + +ATOM_TYPE = Sentinel('atom') +SEQUENCE_TYPE = Sentinel('sequence') +MAPPING_TYPE = Sentinel('mapping') +OBJECT_TYPE = Sentinel('object') +NULL_TYPE = Sentinel('null') +del Sentinel + + +class Converter(object): + def __call__(self, value, result_type=None): + return self.convert(value, source_parent=None, target_parent=None, + attribute=None, sequence_index=None, suggested_type=result_type) + + def convert(self, value, **kwargs): + + # The keyword arguments we have here include data for the reader and + # the writer. We separate kwargs into three parts - + # 1) Reader-only values. + # 2) Writer-only values. + # 3) All keyword arguments. + reader_kwargs = kwargs.copy() + writer_kwargs = kwargs.copy() + convert_kwargs = kwargs + del kwargs + + writer_kwargs['parent'] = writer_kwargs['target_parent'] + reader_kwargs['parent'] = reader_kwargs['source_parent'] + del reader_kwargs['target_parent'] + del reader_kwargs['source_parent'] + del writer_kwargs['target_parent'] + del writer_kwargs['source_parent'] + + # Keyword arguments: + # attribute + # mapping_key + # sequence_index + # suggested_type + # + # parent (reader_kwargs and writer_kwargs, not in standard kwargs) + # source_parent (not in reader_kwargs, not in writer_kwargs) + # target_parent (not in reader_kwargs, not in writer_kwargs) + conversion_type = self.categorise_object(value, **reader_kwargs) + if conversion_type is NULL_TYPE: + return None + + elif conversion_type is ATOM_TYPE: + atomic_value = self.get_atomic_value(value, **reader_kwargs) + return self.convert_atom(atomic_value, **writer_kwargs) + + elif conversion_type is SEQUENCE_TYPE: + accepted_seq = [] + rejected_seq = [] + + # The item we are currently looking at (value) is ignored. + # It is a normal sequence which doesn't contain any useful + # data, so we act as if each item in the sequence is + # actually an attribute of the source object (where the + # attribute name is taken from the attribute name of the + # list). + + # Note - I would use enumerate, but I'm trying to leave this + # Python 2.2 compatible. + sequence_items = self.get_sequence_items(value, **reader_kwargs) + for i in range(len(sequence_items)): + item = sequence_items[i] + + this_kwargs = convert_kwargs.copy() + this_kwargs['sequence_index'] = i + this_kwargs['suggested_type'] = self.get_suggested_type_for_sequence_component(value, **writer_kwargs) + + try: + sub_element = self.convert(item, **this_kwargs) + except SkipConversion, error: + pass + except AbortConversion, error: + import sys + + self.handle_error(item, error, sys.exc_info()[2]) + rejected_seq.append((item, error, sys.exc_info()[2])) + else: + accepted_seq.append(sub_element) + + del this_kwargs + + if rejected_seq: + self.handle_errors(rejected_seq, accepted_seq, conversion_type) + + return self.make_sequence(accepted_seq, **writer_kwargs) + + elif conversion_type is MAPPING_TYPE: + accepted_dict = {} + rejected_dict = {} + + for map_key, map_value in self.get_mapping_items(value, **reader_kwargs): + this_kwargs = convert_kwargs.copy() + this_kwargs['mapping_key'] = map_key + this_kwargs['suggested_type'] = self.get_suggested_type_for_mapping_component(value, **this_kwargs) + try: + converted_value = self.convert(map_value, **this_kwargs) + except SkipConversion, error: + pass + except AbortConversion, error: + import sys + + self.handle_error(map_value, error, sys.exc_info()[2]) + rejected_dict[map_key] = (map_value, error, sys.exc_info()[2]) + else: + accepted_dict[map_key] = converted_value + + del this_kwargs + + if rejected_dict: + self.handle_errors(rejected_dict, accepted_dict, conversion_type) + + return self.make_mapping(accepted_dict, **writer_kwargs) + + elif conversion_type is OBJECT_TYPE: + object_id = self.get_object_id(value, **reader_kwargs) + source_attributes = self.get_object_attributes(value, **reader_kwargs) + + # Try and convert the object attributes first. + # + # If we can't, because the parent object is requested, then + # we'll convert that first instead. + # + # If the code which converts the parent object requests that + # the attributes should be defined first, then we just exit + # with an error - we can't have attributes requesting that the + # object is converted first, and the object requesting attributes + # are converted first. + try: + attributes = self._get_object_attributes(value, None, source_attributes) + except DelayConversion: + # We will allow DelayConversions which arise from this block + # to propogate. + new_object = self.make_object(object_id, attributes=None, **writer_kwargs) + attributes = self._get_object_attributes(value, new_object, source_attributes) + self.add_attributes_to_object(attributes, new_object, **writer_kwargs) + else: + new_object = self.make_object(object_id, attributes, **writer_kwargs) + + return new_object + + else: + raise ValueError, "bad result from categorise_object: %s" % conversion_type + + def _get_object_attributes(self, value, parent, source_attributes): + + accepted = {} + rejected = {} + + for attribute_name, attribute_value in source_attributes.items(): + this_kwargs = {} + this_kwargs['source_parent'] = value + this_kwargs['target_parent'] = parent + this_kwargs['attribute'] = attribute_name + this_kwargs['mapping_key'] = None + this_kwargs['sequence_index'] = None + this_kwargs['suggested_type'] = self.get_suggested_type_for_attribute(value=attribute_value, parent=parent, + attribute=attribute_name, + mapping_key=None) + + try: + converted_value = self.convert(attribute_value, **this_kwargs) + except SkipConversion, error: + pass + except AbortConversion, error: + import sys + + self.handle_error(attribute_value, error, sys.exc_info()[2]) + rejected[attribute_name] = (attribute_value, error, sys.exc_info()[2]) + else: + accepted[attribute_name] = converted_value + + if rejected: + self.handle_errors(rejected, accepted, OBJECT_TYPE) + + return accepted + + def handle_errors(self, rejected, accepted, conversion_type): + if isinstance(rejected, dict): + error_seq = rejected.itervalues() + else: + error_seq = iter(rejected) + + attribute, error, traceback = error_seq.next() + raise error, None, traceback + + def handle_error(self, object_, error, traceback): + raise error, None, traceback + + +class ReaderMixin(object): + # Need to be implemented by subclasses: + # + # def categorise_object(self, value, suggested_type, **kwargs): + # def get_object_id(self, value, **kwargs): + # def get_object_attributes(self, value, **kwargs): + + # You can raise DelayConversion here. + def get_atomic_value(self, value, **kwargs): + return value + + def get_sequence_items(self, value, **kwargs): + return value + + def get_mapping_items(self, value, **kwargs): + return value + + +class WriterMixin(object): + # Need to be implemented by subclasses: + # + # def make_object(self, object_id, attributes, **kwargs): + + # You can raise DelayConversion here. + def convert_atom(self, atomic_value, suggested_type, **kwargs): + if suggested_type is None: + return atomic_value + else: + from dopal.aztypes import unwrap_value + + return unwrap_value(atomic_value, suggested_type) + + def make_sequence(self, sequence, **kwargs): + return sequence + + def make_mapping(self, mapping, **kwargs): + return mapping + + def add_attributes_to_object(self, attributes, new_object, **kwargs): + new_object.update_remote_data(attributes) + + def get_suggested_type_for_sequence_component(self, value, **kwargs): + return None + + def get_suggested_type_for_mapping_component(self, value, **kwargs): + return None + + def get_suggested_type_for_attribute(self, value, **kwargs): + return None + + +class XMLStructureReader(ReaderMixin): + def categorise_object(self, node, suggested_type, **kwargs): + + from xml.dom import Node + + if node is None: + number_of_nodes = 0 + null_value = True + elif isinstance(node, types.StringTypes): + number_of_nodes = -1 # Means "no-node type". + null_value = not node + else: + number_of_nodes = len(node.childNodes) + null_value = not number_of_nodes + + # This is a bit ambiguous - how on earth are we meant to determine + # this? We'll see whether an explicit type is given here, otherwise + # we'll have to just guess. + if null_value: + if suggested_type == 'mapping': + return MAPPING_TYPE + elif is_array_type(suggested_type): + return SEQUENCE_TYPE + + # If the suggested type is atomic, then we inform them that + # it is an atomic object. Some atomic types make sense with + # no nodes (like an empty string). Some don't, of course + # (like an integer), but never mind. It's better to inform + # the caller code that it is an atom if the desired type is + # an atom - otherwise for empty strings, we will get None + # instead. + elif is_java_return_type(suggested_type): + # We'll assume it is just an atom. It can't be an object + # without an object ID. + return ATOM_TYPE + + # Oh well, let's just say it's null then. + else: + return NULL_TYPE + + if number_of_nodes == -1: + return ATOM_TYPE + + if number_of_nodes == 1 and node.firstChild.nodeType == Node.TEXT_NODE: + return ATOM_TYPE + + if number_of_nodes and node.firstChild.nodeName == 'ENTRY': + return SEQUENCE_TYPE + + if suggested_type == 'mapping': + return MAPPING_TYPE + + return OBJECT_TYPE + + def get_atomic_value(self, node, **kwargs): + if node is None: + # The only atomic type which provides an empty response are + # string types, so we will return an empty string. + return '' + elif isinstance(node, types.StringTypes): + return node + else: + from dopal.xmlutils import get_text_content + + return get_text_content(node) + + def get_sequence_items(self, node, **kwargs): + if node is None: + return [] + return node.childNodes + + def get_mapping_items(self, node, **kwargs): + if node is None: + return {} + + # Not actually used, but just in case... + result_dict = {} + for child_node in node.childNodes: + if result_dict.has_key(child_node.nodeName): + raise AbortConversion("duplicate attribute - " + child_node.nodeName, child_node) + result_dict[child_node.nodeName] = child_node + return result_dict + + def get_object_id(node, **kwargs): + if node is None: + return None + + for child_node in node.childNodes: + if child_node.nodeName == '_object_id': + from dopal.xmlutils import get_text_content + + return long(get_text_content(child_node)) + else: + return None + + # Used by StructuredResponse.get_object_id, so we make it static. + get_object_id = staticmethod(get_object_id) + + def get_object_attributes(self, node, **kwargs): + result_dict = self.get_mapping_items(node, **kwargs) + for key in result_dict.keys(): + if key.startswith('azureus_'): + del result_dict[key] + elif key in ['_connection_id', '_object_id']: + del result_dict[key] + return result_dict + + +class ObjectWriterMixin(WriterMixin): + connection = None + + # attributes may be None if not defined at this point. + # + # You can raise DelayConversion here. + def make_object(self, object_id, attributes, suggested_type=None, parent=None, attribute=None, **kwargs): + + class_to_use = None + if suggested_type is not None: + class_to_use = self.get_class_for_object(suggested_type, attributes, parent, attribute) + + if class_to_use is None: + class_to_use = self.get_default_class_for_object() + if class_to_use is None: + # - Drop the attribute. + # - Put the attribute as is (convert it into a typeless + # object) + # - Raise an error. + # + # For now, we'll avoid creating the attribute altogether. + # + # Note - if the object has no parent, then that's a more + # serious situation. We may actually be returning a blank + # value instead of a representive object - in my opinion, + # it is better to fail in these cases. + # + # A broken object (missing attributes) is more desirable than + # having an object missing entirely if it is the actual object + # being returned. + if parent is None: + cls_to_use = AbortConversion + else: + cls_to_use = SkipConversion + + raise cls_to_use(text="no default class defined by converter", obj=(parent, attribute, suggested_type)) + + # Alternative error-based code to use: + # + # err_kwargs = {} + # err_kwargs['obj'] = suggested_type + # if parent is None: + # if attribute is None: + # pass + # else: + # err_kwargs['text'] = 'attr=' + attribute + # else: + # err_kwargs['text'] = "%(parent)r.%(attribute)s" % + # locals() + # raise InvalidRemoteClassTypeError(**err_kwargs) + + result = class_to_use(self.connection, object_id) + if attributes is not None: + self.add_attributes_to_object(attributes, result) + + return result + + def get_class_for_object(self, suggested_type, attributes=None, parent=None, attribute=None): + return None + + def get_default_class_for_object(self): + return None + + +class RemoteObjectWriterMixin(ObjectWriterMixin): + class_map = {} + + # XXX: This will need to be changed to something which will: + # - If true, raise an error if the parent does not return an appropriate + # type for any given attribute. + # - If false, will never complain. + # - If none (default), complain only when debug mode is on. + force_attribute_types = False + + def get_class_for_object(self, suggested_type, attributes=None, parent=None, attribute=None): + if suggested_type is None: + return None + return self.class_map.get(suggested_type, None) + + def get_default_class_for_object(self): + if self.class_map.has_key(None): + return self.class_map[None] + _super = super(RemoteObjectWriterMixin, self) + return _super.get_default_class_for_object() + + def get_suggested_type_for_sequence_component(self, value, suggested_type, **kwargs): + if suggested_type is None: + return None + if is_array_type(suggested_type): + return get_component_type(suggested_type) + else: + raise AbortConversion("parent of value is a sequence, but the suggested type is not an array type", + obj=value) + + def _get_suggested_type_for_named_item(self, value, parent, attribute, mapping_key=None, **kwargs): + if parent is None: + raise DelayConversion + + result_type = None + if hasattr(parent, '_get_type_for_attribute'): + result_type = parent._get_type_for_attribute(attribute, mapping_key) + + if self.force_attribute_types and result_type is None: + txt = "%(parent)r could not provide type for '%(attribute)s'" + if mapping_key is not None: + txt += ", [%(mapping_key)s]" + raise AbortConversion(txt % locals()) + + return result_type + + get_suggested_type_for_mapping_component = \ + get_suggested_type_for_attribute = _get_suggested_type_for_named_item + + +class RemoteObjectConverter(Converter, + XMLStructureReader, RemoteObjectWriterMixin): + def __init__(self, connection=None): + super(Converter, self).__init__() + self.connection = connection + + +def is_azureus_argument_type(java_type): + return is_java_argument_type(java_type) or \ + is_azureus_argument_class(java_type) + + +def is_azureus_return_type(java_type): + return is_java_return_type(java_type) or \ + is_azureus_return_class(java_type) diff --git a/resources/utorrent/dopal/convert.pyc b/resources/utorrent/dopal/convert.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d7affe328624cc83d889d212f7db3133bce7d95 GIT binary patch literal 15243 zcmdU0OKe=%c|P~fgEQptDTxyGut&1xP_?YOj$Nmz>_jG&)Uh?PFJ;T7DNKiRFR3AC z?ojvMu}FvX!gSIENYE4of~4)D%Vrm#i=se*qA0p(H(9h^bddtx^aT{CkuHj$Mf-i< zxpQaq2$E(&#**&QIsbY8@AIECxgU*>ntyp_v1!sjdHnx*eDPh!7~hy>q>fp3jPDvh zXWFjm!L&zBXUr^*nNGzl zS4?NzERUPcgjt@jEsCZ+X_hB7%ZO=Dna;FXo;FS}ZTyni#|mZ)^JV3aC_k$FQRT;! zKc;*|`C0Q0+K-#yxLL#MC(MV&>>Km;@(JTl_MuZ5bk6wGedtUEJ!yQ*HK!4dX3$f{ z$4n;$oz0-9jepz(rv*KcLC+X}&IBh+aLNQ{%v#R)C$qXojDL!Sa9$3a}}#erWy;cpoPjxY2)ba!7wH$U;#p;Ge`Ct5*Cj%wpNLq2d5k-xida|<>Br|}l2T8rz z?QC_!AWSUym~FVxc(;Mp>%C4^b7ZI{3b3_MJ?34&lQ~=2cn>@7ah|lNmX#d8w>Isq zI=j3{G`Ov49%5sX5<6lmtuSaO#7HCQb_9)sJG~%m2FVDZoyOKyD_l>C$Xl$daoB6OlQLj- z-Xw@J@#OAb!WVxANdVRXYZoY|A3{XHT#nc%PdOrEp(>|Lk)lb+i1C)@IbSn}gkJ^U z0>1c3B)i6JAjPQo2hoQ}BgMc-F)Gr6*>xdc1v^Sjq>j72s2S9^8WHv^NCJ|8+9`y4 z$@nZGR{LnEw?aSIwxHhndJrdpKSXCDscAV~n5ltv=DBE<$e2k1CGlx8hFlcHy|(48 zc@&M37>F_ppIvz)2CY}F_?=d`a%F34v5_=Zylw-<^_5q;eru)S``s{J*=qOJTj8a5 z!Ry^iNjKuIf@lR}YoGB-F9ojn-K|D@C0*gAtsRlLUT-$q?Rx!b%o^vp3g?8=B;`)x zBko_p7yljh0aOCr`^N0$hVpsl_X_5H*X#o6j+x_suDQGmLgY}we`(1vFIeCUwx#~d z0SG!eq$6s->6pEu*)5vHHJc?9eVKGzVmYt!_e6EjHETU02>KwCXMeRGQR{zo*0J1@ zVOmzZ(ooM)v;EHoyqk=gUFm12?!{YwYxc%i-W@Y@dlj===Q)5N(yV&?X9#@Q{KjhTm4LR(|`PB>xS+AXQggaGf4n>+txZlYiG_YRkR#2}9* zz$pg|tsET{Xn?53t-m%aApa4whXIB$g;{`;lEu_< z^$X_bhh zqwY=AMgQZbI6^yA-h-nP0u699Cmj7{jy+Bekg{jF;M5T0xY?N#?oJa3O79*g^7l?) z&#z;LXT%HN%Q=on^oZG=rTf5!oX*)B>b;A6zc*)o)a+tm0HUP}dd^~J0Ba1^2+RTI z%u-S{J~+E*WtsB*|zL}HY&7!qOYwA&NYLIv*PPm}kjnHogb@(JOs+Px5U#6h1bEp3ISgwTg9yx%Ze zx5m^geG^YAUw`RKR~K&BIp`sAw9MH`$QDD8%wEO`kx+kVl}7_9!>7qoAL0anFl8WB z-?ghJ-E=0g*PHa~fZ>PJ(FH$!&O<>BPiv+*_>&?SNjS zSWnF1{Ss=looq_K)wF&}Hm4xOCI}`mq|d^}ATc8qr{WZyoIBx6I3xD&*bHEKx8lq=Q%H+W5s*1&6!}qS z*3CJy&ZLvWS8>ibkGtdUh+70aZREXQqd(6$} znt7~;{6V$1fG>U?bf$64D=nDqk^?8kx=D+-ek|iyG=o1P?bYf%e{dQfNp3B1#TVOeUoPonAz0zKph&D{&|o(7$3OW$8#v9v^%zZEj|agtsPM&#<}${8i+%;% zL0h_sis;iaX8@y7p1jrfIPy3+TGJy_Lxt?|5asbSX)O;$+&j(WUK^x-5*VpEYZt0$ z_Y?G8#^CqqXGxm(BqzAYZ0`1CXT9 z`vOP4#^g7cP}UDc!k)*(e}XUO&JARv=*~fkMzg>3_sP&%cR~^*2`HftEu2@m=APzThg(#rh}i< zQ7cAJA!+a+N&%GiqXbg93$Jls(MHOIIHZX!=DAW!$s5cqG5H)4`4Q5$ROpuTND;x4 zsL>10y+TQ?HBa^?Il4_uw?uwH1%S3@gIqUMsE~YOn|84$w}K z0wkA6Rdg%)@_zY|a#_aSlQVLywcQGvXrezPi{c@VA(O^K5DY<}17x(p5FM5Y$usmp zTI(#%412$VPp5PUR9{R0GHN-bvVNT~RWLa~lyGPN#wjgrKUs@^0t^55PwL`-1q=U= z!Q$r`YVzt#ev=6a<8gx?8xDBmpk=0k+5Zt=%p+2D0lX7v7Efp12iD9b9>YQULB!<2}ZhW3LH_rIJoGpGQ%i zjz{6Owa8df9iRk1jyZpfFD`L*r{d<_DH{+ZvVKM-BoFG)l+Z6@p)OYXb1ET{N<WCfqrg(2bY;hSw>o9Sw@;jikZ|6bx~>w5o6LJ&Vk~AY|>Ib z$#4V?ayaAREEj%;Fk;5fe*tGmz2FaFi?p_L^2x0Ucb^E@+EF;E&VLsAalV$@Z9Y@dU z6v)1ePkh|3o}rJx4j*eCOad>0WyjGvj=)^HBXs|uRy*K2#;GnUem@N`BKNB=IvJ7=XA06 zG)KW_yz@+?5zjGq7Ks|KwW2s#U=N+ELUiMBI^N#6`qqtl?fT-?tg41XmyLXIi}tw4 z&9U2%OTxt~suA`&s|c%h*XnE$YerrJ+fd^`rVh|*R@vi+rS-9u($*- z5mM0B3lrRpG6D!NxYl}!;**5y8gdnRc4WXRL97Dr3~*-~CW?62!!EhP+ho#4qVSUS z9>Gbyq}7hScL5)==@Hw?b5sRN2ktpOhB;p$4e0&BbIj#||9iYgYAz`iy2Qh{1#2y# zj9cLTsg_MGDmuswoo};^9txlF1obBONM(sVf~UkelzGxwyIVtMcy~|`OZdPV+b^>M z+g!Z$qQYT_73%Soy!^r)++Ks@VQXRkkr#&(ihq{FIa^Jps{epW+K@Uk#0?y;?eMzk z%V;HG(4z0HRCsPcBCAWtOTs@S!CEjxn4=`V+e&UfOdh-)cA#-UheILDuVU`rfGji4 z5fEh*DrmyF-|?-Y>3tC&k5pBF0{cu_OMZ? z)TES-;-mW`4gOciK*o7Dp(}|^yq>?|dtrf`TSj8dibtnIKOX5NrDjO^QoG zXf(V!gQ*?q?e)i(+2y>*e znAgsY2LgB#Y6ok_d@sNvsc0?MfTItPnfb`^D`aM(gLi5b=M>yb{GF~iWw+=)KE+$> zBW{x_jUO7@J2a99l`vwN+=$uI*D9$ZmgK#;}gz8%-Noe!^f!uR&@0(1vnUEzFOo)41 zLF9ddFtH?OwWoCUz#A`A5BT%|S(K~!L7znp9Pu%@BnlzrQNvHx^fEH3tb zjqE(Z^E9gIUjswd4uWU)9S63LZS6ga!d>=#Vzs+g)y03c6;~V8{!_e*Rs1xdn%oYm z*|WDQqbh6_cJ=cEJ@OaO`wCWN9dF4#O2#8i?U9I!9||)|{n82@3Z5@u;*W@Dno7%l z6~r|phtv*aL1CKAGr;sQKFP4BN1zeWH;ZUs7z`MFjxBM@v_3ak65%<^!Fk5p?5hk0 z`MyrQKwro@Fz`2GIW{@-y!C!~Od8>PJTUVt=$M{Z`Rfqku_mphM}Z`VT!-wC8q+a7 zKW_0fN$ZBnS(T|A4Ahu)72UL(mN(K99TgU2_C(p<@Q zav02!oWlZy+l=Y88DW{vDf~L$N&S%QGmEBVA9y1W)MI#7LN8?;FXL+V(bK>ll9Qx- zz5qM~-tVF)g*32?HkAHtRy@PRLoz^satEl2s2%^Ddz?T9)^eoi&J@bUa;Y*cdJo&o z1^Xk7hy7B8KCZQx)IpWw*<)BxTHQW-VtgFsx{eNgqbG&( z+i34GdXYYNX@#u>?_0hGh-R=FM@4`vIu8(u-^HB&NhETy1_#WVRgeR=kg8;}!=vqMHIbF~$)botE(cLa5yxyv3EF(06m01!;Xdt;py-L{hh5ZAgUuZr@)Nqo z{2AK)KNI7E{%b&#%E0ITf9{xE>(PJHj=kSw4&Om@nO=wwZFK1Oa{oQNP5To8D(`yT z?>6x&Y+U)Ro#ySJxrqyix(5kOZ$iigmZsdMn%aQ5+)G@VNdCBcog-~sz~}f@>&sNw z$NOXj#oiSIwJmMTT_@FZtUk}=X(rDyIm?8aN5btjm|JDC#$=y~+&A*B_xnu#0LcLR z${irDl`#8d`@HT&syw{|EtZPzId|4Mm#ZM)r<1GFoICr+voo`2XE$cA%szv6)WvfC F{{TLZ?a2TD literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/convert.pyo b/resources/utorrent/dopal/convert.pyo new file mode 100644 index 0000000000000000000000000000000000000000..4d7affe328624cc83d889d212f7db3133bce7d95 GIT binary patch literal 15243 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 F{{TLZ?a2TD literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/core.py b/resources/utorrent/dopal/core.py new file mode 100644 index 0000000..5ae0227 --- /dev/null +++ b/resources/utorrent/dopal/core.py @@ -0,0 +1,1024 @@ +# File: core.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +''' +Contains the main objects and functions required for DOPAL to be useful. +''' + +# PyChecker seems to be complaining a lot about inconsistent return types +# (especially returning different types of responses and returning different +# types of exceptions), so we're switching it off. +__pychecker__ = 'no-returnvalues' + +from dopal.aztypes import unwrap_value + +from dopal.errors import AzureusResponseXMLError, MissingObjectIDError, \ + RemoteInternalError, RemoteMethodError, LinkError, InvalidObjectIDError, \ + NoSuchMethodError, InvalidWrapTypeError, InvalidRemoteObjectError, \ + NoObjectIDGivenError, NoEstablishedConnectionError, \ + InvalidConnectionIDError, raise_as, DopalPendingDeprecationWarning + +# +# Low-level class, representing a link to a remote Azureus instance. +# +class AzureusLink(object): + def __init__(self): # AzureusLink + # Default values, can be changed via set_connection_details. + self.link_data = { + 'host': '127.0.0.1', 'port': 6884, 'secure': False, + 'user': None, 'password': ''} + self.debug = None + + def get_cgi_path(self, auth_details=False, include_password=False): # AzureusLink + path_template = "%(protocol)s://%(auth)s%(host)s:%(port)s/process.cgi" + path_data = {} + path_data['host'] = self.link_data['host'] + path_data['port'] = self.link_data['port'] + path_data['user'] = self.link_data['user'] + + if self.link_data['secure']: + path_data['protocol'] = 'https' + else: + path_data['protocol'] = 'http' + + if auth_details and self.link_data['user']: + if include_password: + # path_data['password'] = '*' * len(self.link_data['password']) + path_data['password'] = '*' * 4 + else: + path_data['password'] = self.link_data['password'] + + path_data['auth'] = '%(user)s:%(password)s@' % path_data + else: + path_data['auth'] = '' + + return path_template % path_data + + def _send_data(self, request): + import urllib2 + + return urllib2.urlopen(request) + + def _send_method_exchange(self, xml_data): # AzureusLink + from dopal.debug import ConnectionExchangeDebug, \ + ErrorLinkDebug, OutgoingExchangeDebug + + cgi_path = self.get_cgi_path(auth_details=False) + printable_path = self.get_cgi_path(auth_details=True, include_password=False) + + if self.debug is not None: + debug_data = OutgoingExchangeDebug(printable_path, xml_data) + self.debug(debug_data) + + import socket, urllib2 + + request = urllib2.Request(cgi_path, xml_data) + + # Add User-Agent string. + from dopal import __user_agent__ + + request.add_header("User-agent", __user_agent__) + + # Add authorisation data. + if self.link_data['user']: + auth_string = ("%(user)s:%(password)s" % self.link_data) + base64_string = auth_string.encode('base64').strip() + request.add_header("Authorization", "Basic " + base64_string) + del auth_string, base64_string + + try: + data = self._send_data(request).read() + except (urllib2.URLError, socket.error, LinkError), error: + + # Log the error, if enabled. + if self.debug is not None: + debug_data = ErrorLinkDebug(printable_path, error) + self.debug(debug_data) + + # Error raised here. + raise_as(error, LinkError, obj=cgi_path) + + # Log the exchange, if enabled. + if self.debug is not None: + debug_data = ConnectionExchangeDebug(printable_path, xml_data, data) + self.debug(debug_data) + + return data + + def send_method_exchange(self, xml_data): # AzureusLink + retry_count = 0 + retry_namespace = None + while True: + try: + result = self._send_method_exchange(xml_data) + except LinkError, error: + if retry_namespace is not None: + retry_namespace = {} + if self.handle_link_error(error, retry_count, retry_namespace): + retry_count = 1 + else: + raise error + else: + if retry_count: + self.handle_link_repair(error, retry_count, retry_namespace) + return result + + # This won't happen, but it keeps PyChecker happy. + return None + + def handle_link_error(self, error, retry_count, saved): + return False # Don't bother retrying. + + def handle_link_repair(self, error, retry_count, saved): + pass + + def set_link_details(self, **kwargs): # AzureusLink + """ + Sets the details of where the Azureus server to connect to is located. + + @rtype: None + @keyword host: Host name of the machine to connect to (default is + C{127.0.0.1}). + @keyword port: Server port that Azureus is accepting XML/HTTP + connections on (default is C{6884}). + @keyword secure: Set to a true value if the Azureus is only + accepting secure connections (default is C{False}). + @keyword user: For authenticated connections - the user name to + connect as (default is to use no authentication). + @keyword password: For authenticated connections - the password to + connect with (default is to use no authentication). + """ + + # Smart use of handle_kwargs, I think. :) + from dopal.utils import handle_kwargs + + kwargs = handle_kwargs(kwargs, **self.link_data) + + # for key, value in kwargs.items(): + # if key not in self.link_data: + # raise TypeError, "invalid keyword argument: %s" % key + self.link_data.update(kwargs) + + def __str__(self): # AzureusLink + return "%s for %s" % (self.__class__.__name__, self.link_data['host']) + + +# +# Method generation. +# +def remote_method_call_to_xml(method_name, method_args, request_id, + object_id=None, connection_id=None): + ''' + Generates an XML block which can be sent to Azureus to invoke a remote + method. + + An example of the output generated by this method:: + >>> remote_method_call_to_xml('getDownloads', [True], request_id=123, object_id=456, connection_id=789) + + + + <_object_id>456 + + getDownloads[boolean] + + true + + 789 + 123 + + + The I{method_args} parameter needs to be a sequence of items representing + the method you want to invoke. Each argument needs to be one of the + following types: + - C{boolean} (represented in Java as a boolean) + - C{int} (represented in Java as an int) + - C{long} (represented in Java as a long) + - C{str} or C{unicode} (represented in Java as a String) + - C{float} (represented in Java as a float) + - An object with a I{get_xml_type} method, which returns a string + representing the name of the Java data type that it represents. It + needs to also have one other method on it: + - I{get_object_id} - needs to return the remote ID of the Azureus + object it is representing; or + - I{as_xml} - returns an object which can be converted into a string + containing XML representing the value of this object. Several other + types are supported using this method, defined in the L{aztypes} + module (such as C{java.net.URL}, C{byte[]} etc.) + + @attention: B{Deprecated:} This method is not unicode-safe, nor does it + define what happens when dealing with unicode data. Use + L{remote_method_call_as_xml} instead. + + @param method_name: A string representing the name of the method you want + to invoke (which must either be a method available on the object with the + given object ID, or a special global method which Azureus has some special + case behaviour for). + + @type method_name: str + + @param method_args: A sequence of items representing the arguments you want + to pass to the method (definition of what types are accepted are explained + above). + + @param request_id: The unique ID to be given to this invocation request + (each invocation on a connection must be unique). + @type request_id: str / int / long + + @param object_id: The object on which to invoke the method on. There are + some methods which are special cased which don't require an object ID - in + these cases, this can be left as I{None}. + @type object_id: str / int / long / None + + @param connection_id: The ID of the connection you are using - this value + is given to you once you have initiated a connection with Azureus - this + can be left blank if you haven't yet initiated the connection. + @type connection_id: str / int / long / None + + @return: A string representing the XML block to send. + + @raise InvalidWrapTypeError: Raised if one of the items in the + method_args sequence does not match one of the accepted types. + + @see: L{aztypes} + @see: L{InvalidWrapTypeError} + + @summary: B{Deprecated:} Use L{remote_method_call_as_xml} instead. + ''' + + import warnings + + warnings.warn("remote_method_call_to_xml is deprecated, use remote_method_call_as_xml instead", + DopalPendingDeprecationWarning) + + import types + from dopal.xmlutils import XMLObject, make_xml_ref_for_az_object + + # We check the argument types here, + arg_types = [] + arg_values = [] + for method_arg in method_args: + + # The value has methods on it to tell us how we should handle it. + if hasattr(method_arg, 'get_xml_type'): + arg_type = method_arg.get_xml_type() + + # Either the value generates the XML itself (like below), or we + # are able to determine how to generate the XML for it. + if hasattr(method_arg, 'as_xml'): + arg_value = method_arg.as_xml() + + # The value represents a remote object... + elif hasattr(method_arg, 'get_object_id'): + arg_value = make_xml_ref_for_az_object(method_arg.get_object_id()) + + # If we get here, we don't know how to handle this object. + else: + raise InvalidWrapTypeError(obj=method_arg) + + # We must check boolean types before integers, as booleans are + # a type of integer. + # + # The first check is just to ensure that booleans exist on the + # system (to retain compatibility with Python 2.2) + elif hasattr(types, 'BooleanType') and isinstance(method_arg, bool): + arg_type = 'boolean' + + # lower - the Java booleans are lower case. + arg_value = str(method_arg).lower() + + elif isinstance(method_arg, int): + arg_type = 'int' + arg_value = str(method_arg) + + elif isinstance(method_arg, types.StringTypes): + arg_type = 'String' + arg_value = method_arg + + elif isinstance(method_arg, long): + arg_type = 'long' + arg_value = str(method_arg) + + elif isinstance(method_arg, float): + arg_type = 'float' + arg_value = str(method_arg) + + else: + raise InvalidWrapTypeError(obj=method_arg) + + arg_types.append(arg_type) + arg_values.append(arg_value) + del arg_type, arg_value, method_arg + + # We don't need to refer to method_args again, as we have arg_types and + # arg_values. This prevents the code below accessing method_args + # accidently. + del method_args + + # Now we start to generate the XML. + request_block = XMLObject('REQUEST') + + # Add the object ID (if we have one). + if object_id: + # We are just using this object to generate the XML block, the name + # we give the type is not used, so does not matter. + object_block = make_xml_ref_for_az_object(object_id) + request_block.add_content(object_block) + del object_block + + # Add the method identifier. + method_block = XMLObject('METHOD') + method_content = method_name + if arg_types: + method_content += '[' + ','.join(arg_types) + ']' + method_block.add_content(method_content) + request_block.add_content(method_block) + del method_block, method_content + + # Add method arguments. + if arg_values: + params_block = XMLObject('PARAMS') + for index_pos, xml_value in zip(range(len(arg_values)), arg_values): + entry_block = XMLObject('ENTRY') + entry_block.add_attribute('index', str(index_pos)) + entry_block.add_content(xml_value) + params_block.add_content(entry_block) + + request_block.add_content(params_block) + del index_pos, xml_value, entry_block, params_block + + # Add the connection ID (if we have one). + if connection_id: + connection_id_block = XMLObject('CONNECTION_ID') + connection_id_block.add_content(str(connection_id)) + request_block.add_content(connection_id_block) + del connection_id_block + + # Add a "unique" request ID. + request_id_block = XMLObject('REQUEST_ID') + request_id_block.add_content(str(request_id)) + request_block.add_content(request_id_block) + + return request_block.to_string() + + +def remote_method_call_as_xml(method_name, method_args, request_id, + object_id=None, connection_id=None): + ''' + Generates an XML block which can be sent to Azureus to invoke a remote + method - this is returned as an object which can be turned into a unicode + string. + + An example of the output generated by this method:: + >>> remote_method_call_as_xml('getDownloads', [True], request_id=123, object_id=456, connection_id=789).encode('UTF-8') + + + + + <_object_id>456 + + getDownloads[boolean] + + true + + 789 + 123 + + + The I{method_args} parameter needs to be a sequence of items representing + the method you want to invoke. Each argument needs to be one of the + following types: + - C{boolean} (represented in Java as a boolean) + - C{int} (represented in Java as an int) + - C{long} (represented in Java as a long) + - C{str} or C{unicode} (represented in Java as a String) + - C{float} (represented in Java as a float) + - An object with a I{get_xml_type} method, which returns a string + representing the name of the Java data type that it represents. It + needs to also have one other method on it: + - I{get_object_id} - needs to return the remote ID of the Azureus + object it is representing; or + - I{as_xml} - returns an object which can be converted into a string + containing XML representing the value of this object. Several other + types are supported using this method, defined in the L{aztypes} + module (such as C{java.net.URL}, C{byte[]} etc.) + + @attention: Any byte strings passed to this function will be treated as if + they are text strings, and they can be converted to unicode using the + default system encoding. If the strings represented encoded content, you + must decode them to unicode strings before passing to this function. + + @note: This function will return an object which has an C{encode} method + (to convert the XML into the specified bytestring representation. The + object can also be converted into a unicode string via the C{unicode} + function. Currently, this object will be an instance of + L{UXMLObject}, but this behaviour may change in + future - the only guarantees this function makes is the fact that the + resulting object can be converted into unicode, + and that it will have an encode method on it. + + @param method_name: A string representing the name of the method you want + to invoke (which must either be a method available on the object with the + given object ID, or a special global method which Azureus has some special + case behaviour for). + + @type method_name: str / unicode + + @param method_args: A sequence of items representing the arguments you want + to pass to the method (definition of what types are accepted are explained + above). + + @param request_id: The unique ID to be given to this invocation request + (each invocation on a connection must be unique). + @type request_id: str / unicode / int / long + + @param object_id: The object on which to invoke the method on. There are + some methods which are special cased which don't require an object ID - in + these cases, this can be left as I{None}. + @type object_id: str / unicode / int / long / None + + @param connection_id: The ID of the connection you are using - this value + is given to you once you have initiated a connection with Azureus - this + can be left blank if you haven't yet initiated the connection. + @type connection_id: str / unicode / int / long / None + + @return: An object which has an C{encode} method (to convert the XML into + the specified bytestring representation. The object can also be converted + into a unicode string via the C{unicode} function. Currently, this object + will be an instance of L{UXMLObject}, but this + behaviour may change in future - the only guarantees this function makes is + the fact that the resulting object can be converted into unicode, and that + it will have an encode method on it. + + @raise InvalidWrapTypeError: Raised if one of the items in the + method_args sequence does not match one of the accepted types. + + @see: L{aztypes} + @see: L{InvalidWrapTypeError} + @see: L{UXMLObject} + ''' + + import types + from dopal.xmlutils import UXMLObject, make_xml_ref_for_az_object + + # We check the argument types here, + arg_types = [] + arg_values = [] + for method_arg in method_args: + + # The value has methods on it to tell us how we should handle it. + if hasattr(method_arg, 'get_xml_type'): + arg_type = method_arg.get_xml_type() + + # Either the value generates the XML itself (like below), or we + # are able to determine how to generate the XML for it. + if hasattr(method_arg, 'as_xml'): + arg_value = method_arg.as_xml() + + # The value represents a remote object... + elif hasattr(method_arg, 'get_object_id'): + arg_value = make_xml_ref_for_az_object(method_arg.get_object_id()) + + # If we get here, we don't know how to handle this object. + else: + raise InvalidWrapTypeError(obj=method_arg) + + # We must check boolean types before integers, as booleans are + # a type of integer. + # + # The first check is just to ensure that booleans exist on the + # system (to retain compatibility with Python 2.2) + elif hasattr(types, 'BooleanType') and isinstance(method_arg, bool): + arg_type = 'boolean' + + # lower - the Java booleans are lower case. + arg_value = str(method_arg).lower() + + elif isinstance(method_arg, int): + arg_type = 'int' + arg_value = str(method_arg) + + elif isinstance(method_arg, types.StringTypes): + arg_type = 'String' + arg_value = method_arg + + elif isinstance(method_arg, long): + arg_type = 'long' + arg_value = str(method_arg) + + elif isinstance(method_arg, float): + arg_type = 'float' + arg_value = str(method_arg) + + else: + raise InvalidWrapTypeError(obj=method_arg) + + arg_types.append(arg_type) + arg_values.append(arg_value) + del arg_type, arg_value, method_arg + + # We don't need to refer to method_args again, as we have arg_types and + # arg_values. This prevents the code below accessing method_args + # accidently. + del method_args + + # Now we start to generate the XML. + request_block = UXMLObject('REQUEST') + + # Add the object ID (if we have one). + if object_id: + # We are just using this object to generate the XML block, the name + # we give the type is not used, so does not matter. + object_block = make_xml_ref_for_az_object(object_id) + request_block.add_content(object_block) + del object_block + + # Add the method identifier. + method_block = UXMLObject('METHOD') + method_content = method_name + if arg_types: + method_content += '[' + ','.join(arg_types) + ']' + method_block.add_content(method_content) + request_block.add_content(method_block) + + # Make this easily accessible for the debugger. + request_block.request_method = method_content + del method_block, method_content + + # Add method arguments. + if arg_values: + params_block = UXMLObject('PARAMS') + for index_pos, xml_value in zip(range(len(arg_values)), arg_values): + entry_block = UXMLObject('ENTRY') + entry_block.add_attribute('index', str(index_pos)) + entry_block.add_content(xml_value) + params_block.add_content(entry_block) + + request_block.add_content(params_block) + del index_pos, xml_value, entry_block, params_block + + # Add the connection ID (if we have one). + if connection_id: + connection_id_block = UXMLObject('CONNECTION_ID') + connection_id_block.add_content(str(connection_id)) + request_block.add_content(connection_id_block) + del connection_id_block + + # Add a "unique" request ID. + request_id_block = UXMLObject('REQUEST_ID') + request_id_block.add_content(str(request_id)) + request_block.add_content(request_id_block) + + return request_block + + +# +# Incoming method handling. +# + +# Processes an XML response returned by Azureus, returning an AzureusResponse +# instance. +# +# xml_node must be an instance of xml.dom.Node which has been normalised using +# the normalise_xml_structure function. +# +# This function will raise a AzureusResponseXMLError if the XML is not in the +# format expected. +def process_xml_response(xml_node): + if len(xml_node.childNodes) != 1: + err = "expected one main block inside document, had %s" + raise AzureusResponseXMLError, err % len(xml_node.childNodes) + + block_name = xml_node.firstChild.localName + if block_name != 'RESPONSE': + err = "expected a RESPONSE block, got %s block instead" + raise AzureusResponseXMLError, err % block_name + + response_block = xml_node.firstChild + az_dict = {} + + # We get an empty response block when the remote method doesn't return a + # result (e.g. void), or returns a reponse which is effectively empty + # (empty sequence, empty string) - or perhaps null itself. + if not response_block.hasChildNodes(): + return NullResponse(az_dict) + + # If we detect any child block with the name ERROR, then we'll raise an + # error and ignore the rest of the content (it is possible for the block + # to be embedded alongside other values - normally if something has gone + # wrong during processing. + # + # XXX: Perhaps this could occur anywhere in the tree structure, what should + # we do? + from xml.dom import Node + from dopal.xmlutils import get_text_content + + for child_block in response_block.childNodes: + if child_block.nodeType == Node.ELEMENT_NODE and \ + child_block.nodeName == 'ERROR': + return ErrorResponse(az_dict, get_text_content(child_block)) + + if len(response_block.childNodes) == 1: + node = response_block.firstChild + if node.nodeType == Node.TEXT_NODE: + return AtomicResponse(az_dict, get_text_content(node)) + + # We will have some "complex" XML structure. It may contain the definition + # of one remote object, one remote object with other remote objects + # branching off it, or no remote objects at all. + # + # We will return the XML as-is, but we will try to extract important data + # so that it is more conveniently retrievable. + # + # Nodes which are categorised as being "important" are currently defined + # as information about Azureus and any connection information. + conn_node = None + azureus_nodes = [] + + for node in response_block.childNodes: + if node.nodeName.startswith('azureus_'): + azureus_nodes.append(node) + elif node.nodeName == '_connection_id': + conn_node = node + else: + pass + + # Extract the data from the Azureus nodes. + az_dict = {} + for az_node in azureus_nodes: + name = az_node.nodeName[8:] # (remove "azureus_" prefix) + value = get_text_content(az_node) + az_dict[name] = value + + # Extract the connection ID. + if conn_node: + connection_id = long(get_text_content(conn_node)) + else: + connection_id = None + + # We've got a structured definition. + return StructuredResponse(az_dict, response_block, connection_id) + + +# +# Base class of all types of response which can be returned by Azureus. +# +# It will have at least the following attributes: +# +# azureus_data - dictionary containng information about the instance of +# Azureus which is running. +# +# response_data - The value of the response object. The type of this value +# will differ between different Response implementations. +# +# connection_id - ID of the connection given in the response. Will be None +# if none was given. +# +class AzureusResponse(object): + def __init__(self, azureus_data, response_data=None, connection_id=None): + self.azureus_data = azureus_data + self.response_data = response_data + self.connection_id = connection_id + + +class ErrorResponse(AzureusResponse): + def raise_error(self): + raise generate_remote_error(self.response_data) + + +class StructuredResponse(AzureusResponse): + def get_object_id(self): + # Doesn't matter that this is an abstract class, the method still + # works. :) + from dopal.convert import XMLStructureReader + + return XMLStructureReader.get_object_id(self.response_data) + + +class AtomicResponse(AzureusResponse): + def get_value(self, value_type=None): + if value_type is None: + return self.response_data + else: + return unwrap_value(self.response_data, value_type) + + def as_string(self): + return self.get_value("String") + + def as_int(self): + return self.get_value("int") + + def as_long(self): + return self.get_value("long") + + def as_float(self): + return self.get_value("float") + + def as_bool(self): + return self.get_value("boolean") + + def as_bytes(self): + return self.get_value("byte[]") + + +class NullResponse(AzureusResponse): + ''' + A response class which is used when Azureus returns a response which + contains no content at all. + + This is normally returned when: + - C{null} is returned by the remote method. + - An empty sequence. + - An empty string. + - The return type of the method is C{void}. + ''' + + def get_value(self, value_type=None): + if value_type is None: + return None + elif value_type in ['byte[]', 'String']: + return '' + else: + return InvalidUnwrapTypeError(obj=value_type) + + +# +# Error-handling. +# + +# +# This method takes a string returned in a response and generates an instance +# of RemoteMethodError - it doesn't take into account of any reported class +# type or any other data. +# +def generate_remote_error(message): + # Bad method? + bad_method_prefix = 'Unknown method: ' + if message.startswith(bad_method_prefix): + return NoSuchMethodError(message[len(bad_method_prefix):]) + + # Bad object ID? + if message == 'Object no longer exists': + return InvalidObjectIDError() + + # Missing object ID? + if message == 'Object identifier missing from request': + return MissingObjectIDError() + + # Perhaps a Java exception has occurred remotely. Not always easy to + # detect - it'll mention the Java exception class though. For example, + # passing an non-integer object ID got this error: + # + # u'java.lang.RuntimeException: java.lang.NumberFormatException: For + # input string: "3536f63"' + # + # So we'll try and test to see if a Java exception occurred, by seeing + # if there appears to be a Java-esque exception mentioned. + parts = message.split(':', 1) + if len(parts) == 2: + exception_name = parts[0] + + # A Java-esque exception name: We'll take anything which is defined + # in a package with java. at the start, and ends with Error or + # Exception, then we'll take it. + if exception_name.startswith('java.') and \ + (exception_name.endswith('Error') or \ + exception_name.endswith('Exception')): + return RemoteInternalError(message) + + # Something went wrong - don't know what... + return RemoteMethodError(message) + + +# +# Higher-level version of AzureusLink - this class maintains an active +# connection with the remote server - it also utilises other components +# defined by this module. +# + +class AzureusConnection(AzureusLink): + def __init__(self): # AzureusConnection + AzureusLink.__init__(self) + self.connection_id = None + self.request_id = None # Will be initialised later. + + def update_connection_details(self, connection_id=None, connection_data={}): # AzureusConnection + if connection_id is not None: + self.connection_id = connection_id + + # Return true if the specified method can be called without passing an + # object ID or connection ID. + # + # XXX: Would it be safe to have ExtendedAzureusConnection handle this? + # I would say yes, but look at the invoke_remote_method method, I don't + # think it would behave well if we either return True or False all the + # time... + def _is_global_method_call(self, method_name, method_args): # AzureusConnection + return method_name in ['getDownloads', 'getSingleton'] and not method_args + + def invoke_remote_method(self, object_id, method_name, method_args, raise_errors=True): # AzureusConnection + # We require a connection ID and an object ID, unless we are calling + # a "global" method - methods which don't need either, and which will + # actually return that data to you in the result. + if self._is_global_method_call(method_name, method_args): + connection_id = None + else: + connection_id = self.connection_id + if object_id is None: + raise NoObjectIDGivenError + if connection_id is None: + raise NoEstablishedConnectionError + + from xml.dom.minidom import parseString + from dopal.xmlutils import normalise_xml_structure, get_text_content + + # First step, convert the method data to XML. + xml_data = remote_method_call_as_xml(method_name, method_args, + self.get_new_request_id(), object_id, connection_id) + + xml_data_as_string = xml_data.encode('UTF-8') + + from dopal.debug import MethodRequestDebug, MethodResponseDebug + + # Log a debug message, if appropriate. + if self.debug is not None: + self.debug(MethodRequestDebug(object_id, xml_data.request_method)) + + # Second step, send this to Azureus and get a response back. + xml_response_string = self.send_method_exchange(xml_data_as_string) + + # Third step, convert the string into a xml.dom.Node structure. + xml_structure = parseString(xml_response_string) + + # Fourth step, sanitise the XML structure for easier parsing. + normalise_xml_structure(xml_structure) + + # Fifth step, calculate the Azureus response instance represented by + # this XML structure. + response = process_xml_response(xml_structure) + + # Send another debug message with the response. + if self.debug is not None: + self.debug(MethodResponseDebug(object_id, xml_data.request_method, response)) + + # Sixth step - update our own connection data given in this response. + connection_id = response.connection_id + azureus_data = response.azureus_data + self.update_connection_details(connection_id, azureus_data) + + # Seventh step - return the response (or raise an error, if it's an + # error response). + if raise_errors and isinstance(response, ErrorResponse): + response.raise_error() + + return response + + def get_new_request_id(self): # AzureusConnection + if self.request_id is None: + # We use long to force it to be an integer. + import time + + self.request_id = long(time.time()) + + self.request_id += 1 + return self.request_id + + +class ExtendedAzureusConnection(AzureusConnection): + def __init__(self): # ExtendedAzureusConnection + AzureusConnection.__init__(self) + self.connection_data = {} + self._plugin_interface_id = None + + def invoke_remote_method(self, object_id, method_name, method_args, raise_errors=True): # ExtendedAzureusConnection + try: + response = AzureusConnection.invoke_remote_method(self, object_id, method_name, method_args, raise_errors) + except InvalidObjectIDError: + if self.is_connection_valid(): + raise InvalidRemoteObjectError + else: + raise InvalidConnectionIDError + + if object_id is None and method_name == 'getSingleton' and not method_args and isinstance(response, + StructuredResponse): + self._plugin_interface_id = response.get_object_id() + + return response + + def establish_connection(self, force=True): # ExtendedAzureusConnection + ''' + Establishes a connection with the Azureus server. + + By invoking this method, this will ensure that other methods defined + by this class work correctly, as it will have references both to a + connection ID, and the ID for the plugin interface. + + The C{force} argument determines whether server communication must + take place or not. If C{True}, then this object will communicate with + the Azureus server - if C{False}, then this object will only + communicate with the Azureus server if it has no recorded information + about the plugin interface. + + This method has two uses, depending on the value of the C{force} + argument - it can be used to ensure that there is a valid recorded + connection in place (if force is C{True}), or it can be used just + to ensure that other methods on this class will behave properly (if + force is C{False}). + + If a new connection is established, then the L{_on_reconnect} method + will be invoked. + + @param force: Boolean value indicating if communication with the server + I{must} take place or not (default is C{True}). + @return: None + ''' + + # If 'force' is not true - then we only make a call if we don't have + # any stored reference to a plugin interface ID. + if (not force) and (self._plugin_interface_id is not None): + return + + # Our overridden implementation of this method will set + # what we need. + old_interface_id = self._plugin_interface_id + response = self.invoke_remote_method(None, 'getSingleton', ()) + + # If we had the ID for an old PluginInterface object, then + # that probably signals a reconnection. So let's signal that. + if old_interface_id is not None and \ + old_interface_id != self._plugin_interface_id: + self._on_reconnect() + + return + + def _on_reconnect(self): # ExtendedAzureusConnection + ''' + Hook for subclasses to be notified whenever a new connection has been + made. + ''' + pass + + def is_connection_valid(self): # ExtendedAzureusConnection + + ''' + Returns a boolean value indicating if the current connection is + still valid. + + @invariant: This connection to have already been I{established}. + @raise NoEstablishedConnectionError: If this connection has not been + established. + @return: C{True} if the current established connection is still valid, + C{False} otherwise. + ''' + + if self._plugin_interface_id is None: + raise NoEstablishedConnectionError + + # Try to invoke this method on the remote PluginInterface object. + try: + AzureusConnection.invoke_remote_method(self, self._plugin_interface_id, '_refresh', ()) + except InvalidObjectIDError: + return False + else: + return True + + def __str__(self): # ExtendedAzureusConnection + result = super(ExtendedAzureusConnection, self).__str__() + if self.connection_data.has_key('name') and \ + self.connection_data.has_key('version'): + result += " [%(name)s %(version)s]" % self.connection_data + return result + + def update_connection_details(self, connection_id=None, connection_data={}): # ExtendedAzureusConnection + super(ExtendedAzureusConnection, self).update_connection_details(connection_id) + self.connection_data.update(connection_data) + + def get_azureus_version(self): # ExtendedAzureusConnection + ''' + @since: DOPAL 0.56 + ''' + try: + az_version = self.connection_data['version'] + except KeyError: + raise NoEstablishedConnectionError + else: + import dopal.utils + + return dopal.utils.parse_azureus_version_string(az_version) + + +# Use of this name is deprecated, and this alias will be removed in later +# versions of DOPAL. +ReusableAzureusConnection = ExtendedAzureusConnection diff --git a/resources/utorrent/dopal/core.pyc b/resources/utorrent/dopal/core.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2fa672952293b6177846c727886bf7bc2b77cf5 GIT binary patch literal 31102 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 DqGR+2 literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/core.pyo b/resources/utorrent/dopal/core.pyo new file mode 100644 index 0000000000000000000000000000000000000000..51cfd7dc533dcb66510e6c33bba41485dc13bb68 GIT binary patch literal 31118 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 F{Sz4{eN_Me literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/debug.pyo b/resources/utorrent/dopal/debug.pyo new file mode 100644 index 0000000000000000000000000000000000000000..52db05e101adb0785002c3628a146d9496ae064d GIT binary patch literal 7124 zcmdT}&2J<}6|e3Yk7veTo867G5JfbLEGCe31RM}1i7;NvMsa4N@;Xwy1Fd#<*=~E> zJ?XAlu(UbA=EOh1feV*hQT`$B+~E$t->aSv&N7ifJ9t*K;AnVLWwV`yC^ z^CM_;44qR+YXohNp$(NRjMiNoL+4epq|CgmyF7+ARkAXI-Wfw%DtV2A!?sH9N@qbO z_oTC^lKawGQpxM1Gp!OLXIfUt8*0DvfTw>CO?xZPY?NkYa6HUno95_6SrX(&XC}5~ zFf7gSupb=fMUa@I;mJvwodl1ce7w20-nI)^;4z_31bckH9^gOc4ox%$WO_>PchFZI zAB`nA472FMgrRNA;37|keGDBIKuUTg*WB9Z9h9ahdz;Bcn)NmZgU6ALdOD9VJn4Oy zCuuKA5|G{-^oO8u{dt<0eBI_nVKQrqUSZ07Sj4964J%+T$p=xtCudq8Tx#z4I-ZgQ zHaxq6*It^Pzryh}kFUATtPWGd-ooMPFv}Qk7e!u-PjsDCuK~xg3JO8d^2swECFXK` zxY`z;auv-BPrU#a(eb4N%~236e$bt8IX+3lL1a(u9N>l|bhwhOqbW`QSQD-rXeM`c zQ#`N4FwIgMhHsG|Ql-3>Cp1pjsGC>lyIH{`O>g3Hg6Ufd>64*7$szjNzll$y?8JzW z#+Z=bSo{9xEER6qMeLG50YjUIrO6U^Tl0WAZc?Fdo}0p??_ld&$;B23`!}6u(2??ug*tG2cNNOehY)^s`;WOItqt2(NXH5V_oGq(C;xVxz?`($-9(8BIKKd0KoS zR}ga)hH*bC%P^E+(S^Md9x*8jow1r#bW5!n6lrEd+(~h1PjOuz09Jkvjq+E#y6<^& zo`>F|=XncL@0LIw$ozF_`UO6pmZsvT%$~uszE4K)LVzGSkdK{RGP%aY)2pE1F=BrR z&Pz{u!e(A*H~j~GU(0I-O8Yj7&jVXTu?h0yptAZK9myT;13{Br!Vp0^0=nd;?)czq ze6G2WFi10d(M*qS-jY~G^8d<|@Ykt54TZ{Qn3n8Hd5$aK4|vp;w(bcpcwu}*v(KUH zynJ8vmAdeF|DF{Ewzzlba{_*l6HvdMN}1gYmw(<;#XhSUE?|VBgDa~$qKD9C;!&x0 zv)X7)r`0E3#cwFKuiSRfWh8=7=d%Ub_s^_{VB4l!2b#W!VfNKE^d&+63kxOJ(SLgl zeOb_bFKH8ffot}zA*~3~ue^kNPLXhjqWC!s7iu`}_@8(vx-dFMHj4`znWE3|?K0QK z?eg}d!_b-b#7V1Ux|Y&+5uKZ`Jk1MRX*|M{ua#v=X%M(t$%fQMo|S3x{#yCV(oH!} zyde@01iJEs!PCou*$B3^exgfi_0$v#A^!&dlg+(@?UH%z6uw)kd$6|`yc=wP^zqYA zOU9^E7_wr}%`;Pe^XiQIcK@k9*m`=Pw}nb~nBbWlfw~xs`?dmXHkg}pI7A%kP;U%gd!yn zol)Vp225wpC1j?JbXq9oBN+nZBCi{+^TtuXABJCI_bM}A@wy!$OW42zi`csO@DYdW zY~DpPkyh#56y^H+*!vH7Bv@$p4Zk(ln(ImwVo7=!CV7nip;SHx)kF=baybk&ULs?c zzASSnPF74MO_QdF7gMR36v%cnI;!OU@45d1eZVwdqK}5ZTEkxhfAjL5Z@tx8YCUW% F{Sz4{eN_Me literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/errors.py b/resources/utorrent/dopal/errors.py new file mode 100644 index 0000000..5e7f66e --- /dev/null +++ b/resources/utorrent/dopal/errors.py @@ -0,0 +1,515 @@ +# File: errors.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +''' +Module containing all errors defined in DOPAL. +''' + + +def as_error(error, error_class, **kwargs): + if not isinstance(error, error_class): + error = error_class(error=error, **kwargs) + return error + + +def raise_as(error, error_class, **kwargs): + import sys + + raise as_error(error, error_class, **kwargs), None, sys.exc_info()[2] + + +class DopalError(Exception): + "Subclass of all errors in the Dopal library" + + def __init__(self, *args, **kwargs): + + if len(args) + len(kwargs) > 3: + raise ValueError, "DopalError.__init__ takes at most 3 arguments - %s positional argument(s) given, %s keyword argument(s) given" % ( + len(args), len(kwargs)) + + # Filters out invalid keywords. + from dopal.utils import handle_kwargs + + handle_kwargs(kwargs, error=None, obj=None, text=None) + + error = obj = text = None + has_error = has_object = has_text = False + + import types + + for kwname, kwvalue in kwargs.items(): + + if kwname == 'error': + if not isinstance(kwvalue, Exception): + msg = "'error' keyword argument is not Exception: %r" + raise TypeError, msg % (kwvalue,) + has_error = True + error = kwvalue + + elif kwname == 'text': + if not isinstance(kwvalue, types.StringTypes): + msg = "'text' keyword argument is not a String type: %r" + raise TypeError, msg % (kwvalue,) + has_text = True + text = kwvalue + + else: # kwname == 'obj' + has_object = True + obj = kwvalue + + import types + + for arg in args: + if isinstance(arg, Exception) and not has_error: + has_error = True + error = arg + elif isinstance(arg, types.StringTypes) and not has_text: + has_text = True + text = arg + else: + if has_object: + msg = "could not determine Dopal argument type for %r" + raise TypeError, msg % (arg,) + has_object = True + obj = arg + + dopal_arg_tuple = args + if kwargs: + dopal_arg_tuple += tuple(kwargs.values()) + + dopal_arg_dict = {} + if has_error: + dopal_arg_dict['error'] = error + if has_object: + dopal_arg_dict['object'] = obj + if has_text: + dopal_arg_dict['text'] = text + + self.dopal_arg_tuple = dopal_arg_tuple + self.dopal_arg_dict = dopal_arg_dict + self.error = error + self.obj = obj + self.text = text + self.has_object = has_object + self.has_error = has_error + self.has_text = has_text + + # super(DopalError, self).__init__(dopal_arg_tuple) + Exception.__init__(self, *dopal_arg_tuple) + + def __str__(self): + + # Allow the subclass to render the string if: + # 1) self.args is not the tuple that this class passed to the super + # constructor; or + # 2) We have 2 or more values given to us - the default behaviour for + # rendering the string by the superclass for one or no arguments + # is fine. + if self.args != self.dopal_arg_tuple or \ + len(self.args) < 2: + #return super(DopalError, self).__str__() + return Exception.__str__(self) + + if not self.has_error: + tmpl = "%(text)s (%(object)r)" + + elif not self.has_object: + tmpl = "%(text)s - %(error)s" + + elif not self.has_text: + tmpl = "%(error)s (%(object)r)" + + else: + tmpl = "%(text)s - %(error)s (%(object)r)" + + return tmpl % self.dopal_arg_dict + + def __repr__(self): + arg_parts = ["%s=%r" % item_tpl for item_tpl in self.dopal_arg_dict.items()] + return "%s(%s)" % (self.__class__.__name__, ', '.join(arg_parts)) + + # An alternative to str() of the object - this will make a string of the + # form: + # ErrorClassName: + # + # (This is similar to the last line you see of a traceback). The main + # difference here is that we will use the class name of the internal error + # if there is one, otherwise we will use the class name of the object + # itself. + # + # The error output will be the same string as you get when you apply str() + # to this object. + # + # Setting use_error to False will force it to always ignore the internal + # error. + def to_error_string(self, use_error=True): + if use_error and self.has_error: + error_to_use = self.error + else: + error_to_use = self + + error_output = str(self) + + result = error_to_use.__class__.__name__ + if error_output: + result += ": " + error_output + + return result + + +# ---- core module ----# + +class LinkError(DopalError): + "Error communicating with Azureus (low-level)" + + +class RemoteError(DopalError): # Base class. + "Error reported by Azureus" + + +class RemoteInvocationError(RemoteError): # Base class. + "Unable to invoke remote method" + + +class NoSuchMethodError(RemoteInvocationError): + """ + This error is thrown when Azureus reports that the requested method does + not exist, or is not allowed. + + A NoSuchMethodError is a representation of the response Azureus returns + when trying to invoke a method, but is unable to map the requested method + to a method it can actually invoke. + + Causes + ====== + + There are various reasons why this error may occur, but here are the + most likely. + + Wrong method requested + ---------------------- + The wrong method signature was used - this is possible for a variety + of reasons (though it isn't likely). Check that the method you want to + use is the same one being reported in the NoSuchMethodError instance. + + Method not available in this version of Azureus + ----------------------------------------------- + This method may not be available in the version of Azureus you are + using - although DOPAL normally supports all methods made available in + the latest beta release, this error will occur if the version of Azureus + does not support that method. + + XML/HTTP request processor may not support this method + ------------------------------------------------------ + The request processor used by Azureus may not be able to resolve that + method. Versions 2.3.0.6 and older only allow a small subset of methods + defined in the plugin API to be called. Version 2.4.0.0 (as well as some + later beta versions of 2.3.0.7) have been changed to allow any method to + be called. To enable this, go to the XML/HTTP plugin configuration page, + and tick the I{"Advanced Settings -> Use generic classes"} setting. + + Non read-only method requested, but XML/HTTP in view mode + --------------------------------------------------------- + The XML/HTTP plugin in Azureus is set up to be in "view" mode, so only + certain methods are allowed. Note - if you are unable to call a method + which you think should be allowed in read only mode, contact the + developers of the XML/HTTP plugin. + + @ivar obj: This will be a string which describes the method signature + which was requested - for example:: + getDownloads + setPosition[int] + setTorrentAttribute[TorrentAttribute,String] + """ + + def __init__(self, method_sig): + """ + Creates a new NoSuchMethodError instance. + """ + RemoteInvocationError.__init__(self, obj=method_sig) + + +class NoObjectIDGivenError(DopalError, ValueError): + "No object ID given when needed" + + +class NoEstablishedConnectionError(DopalError, TypeError): + "Connection object has no valid connection established" + + +# Raised by generate_remote_error (which means it is indirectly raised in +# AzureusConnection.invoke_remote_method). +# +# These errors are masked by ExtendedAzureusConnection.invoke_remote_method +# who throw one of the subclass errors (InvalidRemoteObjectError and +# InvalidConnectionIDError). +# +# This error shouldn't arise if you are using a ExtendedAzureusConnection or +# higher-level connection object. +class InvalidObjectIDError(RemoteInvocationError): + "Invalid remote object ID given (bad object or bad connection)" + + +class InvalidRemoteObjectError(InvalidObjectIDError): + "Invalid remote object ID used" + + +class InvalidConnectionIDError(InvalidObjectIDError): + "Invalid connection ID used" + + +class MissingObjectIDError(RemoteInvocationError): + "Missing object ID" + + +# Raised by generate_remote_error (which means it is indirectly raised in +# AzureusConnection.invoke_remote_method). +# +# Higher-level connections (like AzureusObjectConnection) may raise subclasses +# of this error, if they are able to give a more precise error can be +# determined. +class RemoteMethodError(RemoteError): + "Error thrown by remote method" + + +class RemoteInternalError(RemoteError): + "Internal error occurred during remote method invocation" + + +class AzureusResponseXMLError(DopalError): + "Error while parsing XML returned by Azureus" + + +#---- core module ----# + +#---- types module ----# + +class ConversionError(DopalError): # Base class. + "Error converting value (Azureus <--> Python)" + + +class WrapError(ConversionError): + "Error converting value to remote method argument" + + +class UnwrapError(ConversionError): + "Error converting remote method result to Python value" + + +class InvalidWrapTypeError(WrapError, TypeError): + ''' + Invalid wrap type given. + + This error is raised when a value is passed which cannot be converted into + something that can be represented in Azureus. This either means that the + value doesn't meet the criteria as something which can be represented, or + the value doesn't fit the type that it is being wrapped as (e.g. a + non-integer string as a integer). + + @see: L{wrap_value} + @see: L{remote_method_call_to_xml} + ''' + + +class InvalidUnwrapTypeError(UnwrapError, TypeError): + "Invalid unwrap type given." + + +class InconsistentWrapTypeError(WrapError, TypeError): + "Object has wrap type different to requested type" + + +#---- types module ----# + +#---- types (AzMethod) module ----# + +class AzMethodError(DopalError): # Base class. + "Error selecting matching AzMethod" + + def __init__(self, obj, *args, **kwargs): + kwargs['obj'] = obj + self.method_name = obj + DopalError.__init__(self, *args, **kwargs) + + +class IncorrectArgumentCountError(AzMethodError, TypeError): + "Wrong number of arguments given for AzMethod" + + def __init__(self, obj, given_arg_count, required_arg_count): + TypeError.__init__(self) + + # self.required_arg_count is a list + # required_count is used for the 'text' variable + + self.given_arg_count = given_arg_count + + if isinstance(required_arg_count, (int, long)): + self.required_arg_count = [required_arg_count] + required_count = required_arg_count + + elif len(required_arg_count) == 1: + self.required_arg_count = required_arg_count + required_count = required_arg_count[0] + + else: + self.required_arg_count = required_arg_count + required_count = required_arg_count + required_count = list(required_count) + required_count.sort() + + text = "wrong number of arguments given (wanted %(required_count)s, given %(given_arg_count)s)" % locals() + + AzMethodError.__init__(self, obj, text=text) + + +class ArgumentWrapError(AzMethodError): + "Error wrapping argument for AzMethod" + + def __init__(self, arg_index, value, arg_type, error): + text = "error converting arg %(arg_index)s to %(arg_type)s" % locals() + AzMethodError.__init__(self, obj=value, error=error, text=text) + self.arg_index = arg_index + self.arg_type = arg_type + + +class NoSuchAzMethodError(AzMethodError, AttributeError): + "No method of that name available" + + def __init__(self, *args, **kwargs): + AttributeError.__init__(self) + AzMethodError.__init__(self, *args, **kwargs) + + +class MethodArgumentWrapError(AzMethodError): + "Error wrapping argument for multiple AzMethods" + + def __init__(self, name, invocation_errors): + AzMethodError.__init__(self, name) + self.invocation_errors = invocation_errors + + def __str__(self): + text = "Error wrapping arguments:" + error_data = [(str(method_data), str(error.__class__.__name__), str(error)) for (method_data, error) in + self.invocation_errors] + + error_data.sort() + for method_data, err_class, error in error_data: + text += "\n %(method_data)s - %(err_class)s: %(error)s" % locals() + + return text + + +#---- types (AzMethod) module ----# + +#---- objects module ----# + +class ConnectionlessObjectError(DopalError): + "Object has no remote connection" + + +class NonRefreshableObjectError(DopalError): # Base class + "Object cannot be refreshed - refresh not implemented" + + +class NonRefreshableConnectionlessObjectError(NonRefreshableObjectError, ConnectionlessObjectError): + "Object cannot be refreshed - no connection attached" + + def __init__(self, *args, **kwargs): + NonRefreshableObjectError.__init__(self) + ConnectionlessObjectError.__init__(self, *args, **kwargs) + #_superclass = super(NonRefreshableConnectionlessObjectError, self) + #_superclass.__init__(*args, **kwargs) + + +class NonRefreshableObjectTypeError(NonRefreshableObjectError): + "Object cannot be refreshed - not implemented for this type" + + +class NonRefreshableIncompleteObjectError(NonRefreshableObjectError): + "Object cannot be refreshed - insufficient information on object" + + +class StaleObjectReferenceError(NonRefreshableObjectError): + "Object used belongs to old connection, which doesn't have persistency enabled" + + +class MissingRemoteAttributeError(DopalError, AttributeError): + "Object does not have remote attribute available" + + +#---- objects module ----# + +#---- convert module ----# + +class InvalidRemoteClassTypeError(DopalError, TypeError): + "Invalid remote class type given" + + +# Base exception class - used when something cannot be converted. +class StructureConversionError(ConversionError): # Base class. + "Error converting response structure" + + +# Base class for flow control exceptions. +class ConversionControl(StructureConversionError): # Base class. + "Base class for structured conversion control" + + +# Use this class if you want to skip converting the object which +# is being handled. +class SkipConversion(ConversionControl): + "Structured conversion of object skipped" + + +# Use this class if you want to stop converting the object which +# is being handled (essentially signalling a somewhat "fatal" error). +class AbortConversion(ConversionControl): + "Structured conversion of object aborted" + + +# Use this class if you want to signal that you need more information +# before you can proceed with the conversion - either that you need +# the items lower down to be converted first, or you need the items +# higher up converted first. +class DelayConversion(ConversionControl): + "Structured conversion of object delayed" + + +# Use this class if you want to halt conversion completely - this is a more +# severe form of AbortConversion, where it won't be passed to +# Converter.handle_errors. +class HaltConversion(ConversionControl): + "Structured conversion of object halted" + + +class DopalDeprecationWarning(DeprecationWarning, DopalError): + pass + +# PendingDeprecationWarning class doesn't exist in Python 2.2. +try: + class DopalPendingDeprecationWarning(DopalDeprecationWarning, PendingDeprecationWarning): + pass +except NameError: + class DopalPendingDeprecationWarning(DopalDeprecationWarning): + pass + + +class NoDefaultScriptConnectionError(DopalError): + pass + + +class ScriptFunctionError(DopalError): + "Error occurred inside script function." diff --git a/resources/utorrent/dopal/errors.pyc b/resources/utorrent/dopal/errors.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef6d6ec3df3d4a94c5a122edabc79270236a7bd8 GIT binary patch literal 22492 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 literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/errors.pyo b/resources/utorrent/dopal/errors.pyo new file mode 100644 index 0000000000000000000000000000000000000000..761967a1a35737edbf180aec2668f54dd7481e68 GIT binary patch literal 22496 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 j_q6 z8f1$PLE;m?1Bs9PApQU!`2jF9XD0!Pui)r5yED)3%sltZ+VwyB!LL6*-;H7ZS;GIH z_QSivII#F&T0)|@!Tdn8T2WZ!Xfz5dR?g4n`12>pZcTBN|ooSiIq1vKRGh-ku=tL zqf+Cvle=F(-hL!~CgaRn9ea6V{E<{LKFXZ7!S;7$p-U&7E{=7v5papC7^#WR4u$wq|2 zCC4a$GsJb_xqS;7(+-RSD1HYq3qVj(U6=+iTLRmLZ)lA#0MqM3x&)IR%zB7ghG`Gh zXMLFVAz6V>Xoj#hj5|=gFUY#eR=dWKSI9l;Q`~g|&+A=+8J@HZqh(00uu8_f_iDBG z#=^J8z8~55YUKl}WQshjBTpz44Bds|7lCuKUaRO{;l*{>dYHTh4<0_8$6bXPdRAbB zd0{fI6Y5L|s{YB~4SLV-;BddRC@s_x>c!aOY^TcY-)RTC`-saB}#{Z!epGzZdVei3>< z)wtdKiJv_VNV^;fwMr#d&YfgMf+0F+Tr3ADUhpe8Ow?FM^B%woD@PX{kBlAPD~hbR zz(x`Ffe@xIV9kol#^aqy=P{!ru9pkEg3B&0>`fuHcLhD%442Y+ia_ zua0F+>}6K_HX4u?QUFIuvRtJb6J=~jLS^97qST&Z8W-jCs-4%?Uy_F>kyksJA{SB; zehmjaJF4i$3{VL4&NxMehb_X9;CvSGR?-lX>6g(KMGT6F&nOCs63!>aHS3m7#Or-P z%Jx+51%nY{lt~>Ez`S|=((^WI2I`=Y*a#^SgC?gD^X9nnkeJ~*LTVAtnKSeh>{1*y zR)tVC`wG7}ijZm#ui-GjryAS=&UQA3&!`uN+sVY(;dY+yDzAoNrf_*U{3=V#P$fxb z-LRr<QdrB$PTVhr8L`z() z)7Zj!Al7S@wOd;ib@Z>GJ*c&C72yA#=-1Y8ToHYGY60%)qg{xm5NKyIqln@}QA`c7 zcy=f(5s2Ssc%?t#%VLkmP@=iIJcxd6kN+QrNTHlM-4Bj>6-0GmI#NWX<^`oyFYxaQ z?aLf>a)`IkA$N~A6P=abuu2G$D->9S*P(uiKP>3v0ZW(oAW6rlWr_1SeWXORyiFGB zgetO&3zO4j#Y$p*o|`x} method. This + method also takes an additional keyword - C{persistent}, which determines + whether the connection should be persistent or not (by default, it is not + persistent). + + This function will return a DopalConnection instance. + + @rtype: L{DopalConnection} + @see: L{set_link_details} + ''' + connection = DopalConnection() + connection.set_link_details(**kwargs) + + if not persistent: + connection.is_persistent_connection = False + return connection + + +from dopal.objects import AzureusObjectConnection + + +class DopalConnection(AzureusObjectConnection): + ''' + A subclass of + L{AzureusObjectConnection} which + contains an extended API. + + This class defines an extended API, similar to the way that C{Dopal} + classes contain additional methods compared to their C{Azureus} + counterparts. It also sets up some different default behaviours (compared + to L{AzureusObjectConnection}): + - All instances are I{persistent} connections by default. + - A L{RemoteObjectConverter} + instance is installed as the default handler for converting XML to + its appropriate object representation. + - The L{DOPAL class map} is used as the + standard class mapping. + + @see: The L{obj_impl} module documentation. + ''' + + def __init__(self): + super(DopalConnection, self).__init__() + + from dopal.convert import RemoteObjectConverter + + converter = RemoteObjectConverter(self) + + from dopal.obj_impl import DOPAL_CLASS_MAP + + converter.class_map = DOPAL_CLASS_MAP + self.converter = converter + + self.is_persistent_connection = True + + +del AzureusObjectConnection diff --git a/resources/utorrent/dopal/main.pyc b/resources/utorrent/dopal/main.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b64436666ab0f2d63c7f228b0aabef794530010 GIT binary patch literal 2900 zcmc&$U2o$=6dfmNb{kqKs(^hQ-m+4$#A~%G4XHrYrn^;A1Y07ksb|v6*7jJQaYJb% zA+fLgAO06V0L~pdABu{EgtS=o)bn-c%)R%Vo93UponQa>{v>Ag)5QN{y!I>XpjG4|$ii~ZPQvdu=_CuHbLG@Ub{ zGoBh*CW=o?!Aq;NYkuI2w`6k_>xov9U)}K=bvHAGTjioeXE%{lPUytGkc2UeO`*aX*8tPu=DMRf zPnDY*8S;y1jj$TvBC&=$aief@#)Xuct|5{IApQmK-{-2Z+B!g=(}i_BRqf*E$PtwNxf_rYI0;Rg4Q|O~#* z>=SOBf~aAB=dYV0ch(?(LdO$g_VISG+h_+nf&L4RXPWyA<8`9GzIqE{t@t&hJux-( z5HG*RYiWmq!azLGLRcU&_-L}>s7tiBZ{Q;zfgZQzRh$TGxtaKp!Tmp+RmawN2zEi8 zO+;Xg&vkDLZU*Ht&l2@Bs35`Z-udZzepZJgr->Fsr}c&4vQBj(z!4A*G?|Gz{0H^> zmDJ3ubLaxtU7xqk$cnKvmF7?hSsT&?EYugRZJ3hcheePYe(EZcBiAf1b8bzlxYU!0 zqA)Kg2#!w0twy{p?=DX8hyeFLJM#IVH^reQJy3VS&`Rx2*Y#yhJuGQwtq|dAKhO+S zYMffe3p$MJE(x1aKYVn}QRN`g`UM8k9sivqaH+69Hub4|Dl(Zs)~FgGB4n6K(hp|? zIKPGjQ*f-v^TOnXrs`4U6$B~=gWzLd8CEyAK=4ssd|9hfCKdTAB_o~YN$97e{-8G+ zMQ6Qp1iAW(VJ8z)h1s7kIhu`f?+aD9a(Wg{W# z6WxA7g9__VSW#zDVH;G>1JDvxzbg6j0Ohut4;bn&&Ee<37E9Y~-o#v!YH##}S{R9* zGPmtNI>hmjSJGE&qCt}KXf!KL@tRA{TzRYe0ih&~wI!6(ON)DoZWQTEyC`zI=q!q- z59@H7wtTo8UU+LrS_XX3CSqoUP*uGu8;}s>o{OSXL-J8o2588tWa5nusQ`F0UYp;i zKo56tv=19yj0O9RyBXhlCeq`Udh|3AQe!o8@xd9)8KmH@RIJJ0rlPe1<~ DGSyr` literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/main.pyo b/resources/utorrent/dopal/main.pyo new file mode 100644 index 0000000000000000000000000000000000000000..104ecc253d2f92352b8c595e8727f76ed809e5a3 GIT binary patch literal 2900 zcmc&$U2oeq6s2s(ZM&{r5b zr$T2uHL^?;pO}J|R%ciI_{~{wz-QV`d7_=enwntMg`GISSA?a3`xS1xkHL8l^9H+b zuy+Bw57_UF1@~C(GUsQbCd(KtkGf>R9^v~A$MwC+R3V(=f)DPFO)iqY$ubo?ZL&Fc zhKr2%ek}`CT5eTwql$e#n;NTlVq!tNxVGMs%~h-?T1kF+%dge#%oLJ~;;Kwl=4{yU zo6ZfaC|D3~vBzQ)+{dxXos#>0-A$F>KDe{WMTyR?BdMIwiG3*vV;Gx4g*C1Lmcz|` zhjX4PH#IWk=hGTtHNiz<4R_*N!E?ril$wqqk_90CCGX$ms<7HRK%dirbv)%jpo&yy zsygp%3j3j){J#m$)g``CIj-4>PJCm1&1 zxIHSdjl{VvOn!&hEB6df+D5A*N2~aCskmJS!)n>J@p?T&Em^;^wi^qqOM|_{&_5Xe zfFiZyo&dY%xN!=ihWV{OZi?DjgZz}-6JoZv9qcyR!A_w6!sVIfKF54rsBbRcfmkbk4e6Vh z2D*rs-{7|Ng@VFBJTO97AToGpvf-#pw6|{&BcFjDx8-G=2y3~S_?f}oKlrM1Ydi$I zpw1>Du*TQAw}mi+a+zm|`UO;w;CAoqWW7Es=cs9-1<`4JBe<+nod|FQgab`x;uilw z{eC4i^U4n$0AJVs))`qbmX^{SDj{n_x`2iHptTKCQvR?BQo~PNMRL@d#TNfnoR zGEtP~1qH#;skqU|x8>c12agDF|8pRpA9zz7YSIIB7Ywb`?qpqG*3`q2cGe0JuD%DF zp-PQY%X~qHaoidOQ%m~s zbb#R3kYEad6?tBmywKD=s=9(e^sBi1m{RT+KX>%Rmr3xUzKE}(>w|Na?~I6 zMx*GocZOO7&eAR+E}fIsNrCRNG?fG5Li@b9RStp5o8It5y`gHk(!{JKyh$3%j1^0!1~JH79smFU literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/obj_impl.py b/resources/utorrent/dopal/obj_impl.py new file mode 100644 index 0000000..d1916a2 --- /dev/null +++ b/resources/utorrent/dopal/obj_impl.py @@ -0,0 +1,321 @@ +# File: obj_impl.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +''' +Implementation of classes defined by Azureus's plugin API. + +Not all classes are defined here are mentioned in the API documentation (simply +because too much documentation will be generated). + +For each class that DOPAL has explicit support for, there will be two classes +defined in this module. The list of classes supported in this version is +described in L{classes}. + +For each class supported, there will be a class named +I{AzureusE{<}classnameE{>}}, and another class named I{DopalE{<}classnameE{>}}. + +The I{Azureus*} class is a subclass of L{AzureusObject} mixed in with the +I{*DataType} class in the L{class_defs} module - the API closely resembles +that of the actual object in Azureus. + +The I{Dopal*} class is a subclass of the I{Azureus*} class, mixed in with the +L{DopalObjectMixin} class. These classes exist to define an extended API of +convenience functions beyond the API supplied by Azureus itself. Although all +plugin classes have a I{Dopal*} representation, only those classes mentioned +in the API documentation have any extended behaviour defined for them. + +@group Standard class implementations: %(standard_classes)s +@group DOPAL class implementation: %(dopal_classes)s +''' + +import dopal.class_defs as _cdefs +from dopal.objects import AzureusObject, TypelessRemoteObject +from dopal.errors import MissingRemoteAttributeError + +# Temporary value - should be removed once the import has finished. +import dopal + +__epydoc_mode = dopal.__dopal_mode__ == 2 +del dopal + +# Imported just for the __str__ method of DopalObjectMixin. +import sys + +# The code here is used to create representive classes of each of the remote +# Azureus class types that we support. +import new + + +def _make_class(common_cls, data_type_cls, name_prefix, class_map_dict=None): + az_class_name = data_type_cls.get_xml_type() + new_class_name = name_prefix + az_class_name + + # Is the class already defined in the global namespace? If so - we + # avoid defining it again. + if globals().has_key(new_class_name): + classobj = globals()[new_class_name] + else: + base_classes = (common_cls, data_type_cls) + classobj = new.classobj(new_class_name, base_classes, {}) + del base_classes + globals()[new_class_name] = classobj + + if __epydoc_mode: + classobj.__plugin_class__ = True + + if class_map_dict is not None: + class_map_dict[az_class_name] = classobj + return classobj + +# The two class maps we provide by default. +STANDARD_CLASS_MAP = {} +DOPAL_CLASS_MAP = {} + +# These methods are common on all DOPAL variants of classes we create. +class DopalObjectMixin: + # Used by repr. + def short_description(self): + try: + result = self._short_description() + except MissingRemoteAttributeError: + result = None + + if result is None: + return '' + return result + + # Used by str. + def full_description(self): + try: + result = self._full_description() + except MissingRemoteAttributeError: + result = None + + if result is None: + return '' + return result + + def _short_description(self): + return None + + def _full_description(self): + return self.short_description() + + def __str__(self): # DopalObjectMixin + ''' + Generates a string representation of this object - the value of this + string will be the result returned by the L{__unicode__} method. + + Note - this method should return a string which is appropriate for + the system's encoding (so C{UnicodeEncodeError}s should not occur), but + it makes no guarantee I{how} it will do this. + + As of DOPAL 0.60, it encodes the string using the default system + encoding, using 'replace' as the default way to handle encoding + problems. + ''' + # What should be the default behaviour? + # + # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/466341 + # + # 1) Use encoding - "raw_unicode_escape". + # 2) Use error handler - "replace" (current). + # 3) Use error handler - "ignore". + return unicode(self).encode(sys.getdefaultencoding(), 'replace') + + def __unicode__(self): + ''' + Generates a text representation of this object. If the + L{full_description} returns a useful representation, then the string + will have this format:: + RemoteTypeName: FullDescriptionString + + Otherwise, it will resort to the superclass string representation. + + Example:: + Download: The Subways - Staring at the Sun.mp3 [Stopped, 100.0%] + ''' + + nice_name = self.full_description() + + if nice_name: + result = "%s: %s" % (self.get_remote_type(), nice_name) + else: + result = AzureusObject.__str__(self) + + try: + return unicode(result) + + # Python 2.2 doesn't define UnicodeDecodeError, we have to use + # UnicodeError. + except UnicodeError, error: + # string_escape only defined in Python 2.3. + if sys.version_info >= (2, 3): + return unicode(result.encode('string_escape')) + else: + return unicode(AzureusObject.__str__(self)) + # + + def __repr__(self): + nice_name = self.short_description() + + repr_string = AzureusObject.__repr__(self) + if nice_name: + if repr_string[-1:] == ">": + repr_string = repr_string[:-1] + \ + ', for "%s">' % nice_name + return repr_string + + +class DopalObjectStatsMixin(DopalObjectMixin): + def _short_description(self): + return "S:%s P:%s" % (self.seed_count, self.non_seed_count) + + def _full_description(self): + return "Seeds: %s, Peers: %s" % (self.seed_count, self.non_seed_count) + +# Some classes which are basically stat counts share these methods. + +# Now we create the classes - the standard variants first, then the DOPAL +# enhanced variants afterwards. +# +# The DOPAL variants are only automatically generated if we haven't defined +# them manually. We only define them manually if we have methods we want +# to define on them. +for az_class in _cdefs._class_map.values(): + _make_class(AzureusObject, az_class, 'Azureus', STANDARD_CLASS_MAP) +del az_class + +# +# +# We've now created all the classes we wanted. We now define extra methods +# on particular classes we care about. +# +# + +# Now we declare DOPAL variants of these classes - these classes will end up +# providing a richer API than just the standard plugin classes. +class DopalPluginConfig(DopalObjectMixin, AzureusPluginConfig): + def get_upload_speed_limit(self): + return self.getIntParameter(self.CORE_PARAM_INT_MAX_UPLOAD_SPEED_KBYTES_PER_SEC, 0) + + def get_download_speed_limit(self): + return self.getIntParameter(self.CORE_PARAM_INT_MAX_DOWNLOAD_SPEED_KBYTES_PER_SEC, 0) + + def set_upload_speed_limit(self, limit): + if limit is None: + limit = 0 + self.setIntParameter(self.CORE_PARAM_INT_MAX_UPLOAD_SPEED_KBYTES_PER_SEC, limit) + + def set_download_speed_limit(self, limit): + if limit is None: + limit = 0 + self.setIntParameter(self.CORE_PARAM_INT_MAX_DOWNLOAD_SPEED_KBYTES_PER_SEC, limit) + + +class DopalDownload(DopalObjectMixin, AzureusDownload): + def _short_description(self): + return self.torrent.short_description() + + def _full_description(self): + result = self.short_description() + if not result: + return result + + result += " " + self.stats.full_description() + return result + + +class DopalDownloadStats(DopalObjectMixin, AzureusDownloadStats): + def _full_description(self): + return "[%s, %.1f%%]" % (self.status, float(self.completed) / 10) + + +class DopalDiskManagerFileInfo(DopalObjectMixin, AzureusDiskManagerFileInfo): + def _full_description(self): + filename = self.short_description() + if not filename: + return None + + if self.is_skipped: + return filename + " [skipped]" + elif self.is_priority: + return filename + " [high]" + else: + return filename + " [normal]" + + def _short_description(self): + import os.path + + return os.path.basename(self.file) + + +class DopalLoggerChannel(DopalObjectMixin, AzureusLoggerChannel): + def _full_description(self): + result = self.name + if not self.enabled: + result += " [disabled]" + return result + + def _short_description(self): + return self.name + + +class DopalPeer(DopalObjectMixin, AzureusPeer): + def _full_description(self): + return "%s:%s" % (self.ip, self.port) + + def _short_description(self): + return self.ip + + +class DopalPluginInterface(DopalObjectMixin, AzureusPluginInterface): + def _full_description(self): + return self.plugin_name + + def _short_description(self): + return self.plugin_id + + +class DopalTorrent(DopalObjectMixin, AzureusTorrent): + def _short_description(self): + return self.name + +# Let's define the rest of the DOPAL classes. +for az_class in [AzureusDownloadAnnounceResult, AzureusDownloadScrapeResult]: + _make_class(DopalObjectStatsMixin, az_class, 'Dopal', DOPAL_CLASS_MAP) +for az_class in STANDARD_CLASS_MAP.values(): + _make_class(DopalObjectMixin, az_class, 'Dopal', DOPAL_CLASS_MAP) +del az_class + + +# Amend the docstring to contain all the object types defined. +doc_string_sub_dict = {} +for class_map_dict, dict_entry in [ + (STANDARD_CLASS_MAP, 'standard_classes'), + (DOPAL_CLASS_MAP, 'dopal_classes'), +]: + cls = None + classes_in_map = [cls.__name__ for cls in class_map_dict.values()] + classes_in_map.sort() + doc_string_sub_dict[dict_entry] = ', '.join(classes_in_map) + del classes_in_map, cls + +__doc__ = __doc__ % doc_string_sub_dict +del doc_string_sub_dict +del __epydoc_mode + +STANDARD_CLASS_MAP[None] = DOPAL_CLASS_MAP[None] = TypelessRemoteObject diff --git a/resources/utorrent/dopal/obj_impl.pyc b/resources/utorrent/dopal/obj_impl.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70d6b2dcb19e54e9a9387dcea0b3f1e1783176a0 GIT binary patch literal 13570 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 literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/obj_impl.pyo b/resources/utorrent/dopal/obj_impl.pyo new file mode 100644 index 0000000000000000000000000000000000000000..70d6b2dcb19e54e9a9387dcea0b3f1e1783176a0 GIT binary patch literal 13570 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 literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/objects.py b/resources/utorrent/dopal/objects.py new file mode 100644 index 0000000..b1e7935 --- /dev/null +++ b/resources/utorrent/dopal/objects.py @@ -0,0 +1,578 @@ +# File: objects.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +''' +Defines the object layer framework. +''' + +from dopal.core import ExtendedAzureusConnection +from dopal.errors import AzMethodError, InvalidObjectIDError, \ + RemoteMethodError, StaleObjectReferenceError, ConnectionlessObjectError, \ + NonRefreshableConnectionlessObjectError, MissingRemoteAttributeError, \ + NonRefreshableIncompleteObjectError, NonRefreshableObjectError +import dopal.utils + + +class AzureusObjectConnection(ExtendedAzureusConnection): + ''' + This connection class generates remote representations of each object available in Azureus. + + @ivar is_persistent_connection: Boolean indicating whether the connection should be persistent. Default is C{False}. + + @ivar converter: Callable object which will be used to convert response data into objects. + + This will usually be a L{RemoteObjectConverter} instance which will convert the results of method invocations into objects. A value must be assigned for this object to work - no suitable default is provided automatically. + ''' + + def __init__(self): # AzureusObjectConnection + ExtendedAzureusConnection.__init__(self) + self.is_persistent_connection = False + self.converter = None + self.cached_plugin_interface_object = None + + def _on_reconnect(self): # AzureusObjectConnection + if not self.is_persistent_connection: + self.cached_plugin_interface_object = None + + def get_plugin_interface(self): # AzureusObjectConnection + # XXX: Add docstring. + + obj = self.cached_plugin_interface_object + if self.cached_plugin_interface_object is not None: + + # Try to verify that it exists. + # + # Why do we verify the object? Well, we just want to ensure that + # the object we return here is valid. It would be valid if we + # returned getPluginInterface. If the object needs repairing, + # then it is better to do it immediately. + # + # Why do we not rely on the object just sorting itself out? + # Well, the default definitions for extracting the object from the + # root will use the plugin interface object as the root. + # + try: + self.verify_objects([self.cached_plugin_interface_object]) + except NonRefreshableObjectError: + # Subclasses of this error will occur if there's a problem + # refreshing the object (for whatever reason). Refreshing + # it will only occur if the object is not valid. + # + # If, for whatever reason, our cached plugin interface hasn't + # repaired itself, we'll just lose the cached version and get + # a new object. + # + # Why do we not just get a plugin interface object and update + # the cached plugin interface object? If the object is + # 'broken', or object persistency is not enabled, there's no + # reason to repair it - we wouldn't normally do that for any + # other object. + # + # But it is important we return a valid object. + self.cached_plugin_interface_object = None + + if self.cached_plugin_interface_object is None: + self.cached_plugin_interface_object = self.getPluginInterface() + + return self.cached_plugin_interface_object + + def getPluginInterface(self): # AzureusObjectConnection + return self.invoke_object_method(None, 'getSingleton', (), 'PluginInterface') + + # Invoke the remote method - nothing regarding object persistency is + # handled here. + def _invoke_object_method(self, az_object, method_name, method_args, result_type=None): # AzureusObjectConnection + if az_object is None: + az_object_id = None + else: + az_object_id = az_object.get_object_id() + + # We don't need to extract the object ID's for objects which are in + # method_args - they will be an instance of one of the wrapper type + # classes, which will be appropriate enough to pull out the correct + # type to use. + response = self.invoke_remote_method(az_object_id, method_name, method_args) + + result = self.converter(response.response_data, result_type=result_type) + return result + + def invoke_object_method(self, az_object, method_name, method_args, result_type=None): # AzureusObjectConnection + + objects = [obj for obj in method_args if isinstance(obj, RemoteObject)] + if az_object is not None: + objects.insert(0, az_object) + + self.verify_objects(objects) + + try: + return self._invoke_object_method(az_object, method_name, method_args, result_type) + except InvalidObjectIDError, error: + # You don't need to call is_connection_valid, since you'll know + # from the subclasses error. It's an unnecessary method call - fix + # it! + if not self.is_persistent_connection: + raise + if self.is_connection_valid(): + raise + self.establish_connection() + self.verify_objects(objects) + + # Two very quick failures of this type is unlikely to happen - + # it is more likely to be a logic error in this case, so we + # don't retry if it fails again. + return self._invoke_object_method(az_object, method_name, method_args, result_type) + + def verify_objects(self, objects): # AzureusObjectConnection + # I did write this as a list expression initially, but I guess we + # should keep it readable. + has_refreshed_objects = False + for obj in objects: + if obj.__connection_id__ != self.connection_id: + if self.is_persistent_connection: + obj._refresh_object(self) + has_refreshed_objects = True + else: + raise StaleObjectReferenceError, obj + return has_refreshed_objects + + +class RemoteObject(object): + def __init__(self, connection, object_id, attributes=None): # RemoteObject + + if connection is None: + self.__connection_id__ = None + elif isinstance(connection, AzureusObjectConnection): + self.__connection_id__ = connection.connection_id + else: + err = "connection must be instance of AzureusObjectConnection: %s" + raise ValueError, err % connection + + self.__connection__ = connection + self.__object_id__ = object_id + + if attributes is not None: + self.update_remote_data(attributes) + + def __repr__(self): # RemoteObject + txt = "<%s object at 0x%08X" % (self.__class__.__name__, id(self)) + + # "sid" stands for short ID. + sid = self.get_short_object_id() + if sid is not None: + txt += ", sid=%s" % sid + return txt + ">" + + def __str__(self): # RemoteObject + sid = self.get_short_object_id() + if sid is None: + return RemoteObject.__repr__(self) + else: + return "<%s, sid=%s>" % (self.__class__.__name__, sid) + + def get_short_object_id(self): + if self.__object_id__ is None: + return None + + return dopal.utils.make_short_object_id(self.__object_id__) + + def get_object_id(self): # RemoteObject + return self.__object_id__ + + def get_remote_type(self): # RemoteObject + if not hasattr(self, 'get_xml_type'): + return None + return self.get_xml_type() + + def get_remote_attributes(self): # RemoteObject + result = {} + result['__connection__'] = self.__connection__ + result['__connection_id__'] = self.__connection_id__ + result['__object_id__'] = self.__object_id__ + return result + + # set_remote_attribute and update_remote_data are very closely + # linked - the former sets one attribute at a time while the + # other sets multiple attributes together. It is recommended + # that set_remote_attribute is not overridden, but + # update_remote_data is instead. If you choose to override + # set_remote_attribute, you should override update_remote_data + # to use set_remote_attribute. + def set_remote_attribute(self, name, value): # RemoteObject + return self.update_remote_data({name: value}) + + def update_remote_data(self, attribute_data): # RemoteObject + for key, value in attribute_data.items(): + setattr(self, key, value) + + def get_connection(self): # RemoteObject + if self.__connection__ is None: + raise ConnectionlessObjectError, self + return self.__connection__ + + # Exits quietly if the current connection is valid. + # + # If it is invalid, then this object's _refresh_object method will be + # called instead to retrieve a new object ID (if applicable), but only + # if this object's connection is a persistent one. If not, it will raise + # a StaleObjectReferenceError. + def verify_connection(self): # RemoteObject + return self.get_connection().verify_objects([self]) + + def refresh_object(self): # RemoteObject + ''' + Updates the remote attributes on this object. + + @raise NonRefreshableConnectionlessObjectError: If the object is not + attached to a connection. + @return: None + ''' + try: + if not self.verify_connection(): + self._refresh_object(self.__connection__) + except ConnectionlessObjectError: + raise NonRefreshableConnectionlessObjectError, self + + def _refresh_object(self, connection_to_use): # RemoteObject + ''' + Internal method which refreshes the attributes on the object. + + This method actually performs two different functionalities. + + If the connection to use is the same as the one already attached, + with the same connection ID, then a refresh will take place. + + If the connection is either a different connection, or the connection + ID is different, then an attempt will be made to retrieve the + equivalent object to update the attributes. + + @param connection_to_use: The connection object to update with. + @type connection_to_use: L{AzureusObjectConnection} + @raise NonRefreshableObjectTypeError: Raised when the object type is + not one which can be refreshed on broken connections. + @raise NonRefreshableIncompleteObjectError: Raised when the object is + missing certain attributes which prevents it being refreshed on broken + connections. + @return: None + ''' + + # If the object is still valid, let's use the refresh method. + if (self.__connection__ == connection_to_use) and \ + self.__connection_id__ == connection_to_use.connection_id: + new_object = connection_to_use.invoke_object_method( + self, '_refresh', (), result_type=self.get_xml_type()) + + # The object is no longer valid. Let's grab the equivalent object. + else: + + # Special case - if the object is the cached plugin interface + # object, then we need to avoid calling get_plugin_interface. + # + # Why? Because that'll pick up that the object is invalid, and + # then attempt to refresh it. Recursive infinite loop. + # + # So in that case, we just get a plugin interface object + # directly. + if connection_to_use.cached_plugin_interface_object is self: + new_object = connection_to_use.getPluginInterface() + else: + root = connection_to_use.get_plugin_interface() + new_object = self._get_self_from_root_object(root) + del root + + # Get the attributes... + new_data = new_object.get_remote_attributes() + + # (Make sure that the important attributes are there...) + if __debug__: + attrs = ['__connection__', '__connection_id__', '__object_id__'] + for key in attrs: + if key not in new_data: + err = "%r.get_remote_attributes() is missing values!" + raise AssertionError, err % self + del attrs, key + + # Update the values. + self.update_remote_data(new_data) + + # This method is used to locate the remote equivalent object from the + # plugin interface object. If the object cannot be retrieved from the + # PluginInterface, you should raise a NonRefreshableObjectTypeError + # instead (this is the default behaviour). + def _get_self_from_root_object(self, plugin_interface): # RemoteObject + raise NonRefreshableObjectError, self + + def invoke_object_method(self, method, method_args, result_type=None): # RemoteObject + try: + return self.get_connection().invoke_object_method(self, method, method_args, result_type=result_type) + except RemoteMethodError, error: + + # There's three different ways an error can be generated here: + # 1) _handle_invocation_error raises an error - this will have + # the traceback of where it was raised. + # 2) _handle_invocation_error returns an error object - this + # will have the traceback of the original exception. + # 3) _handle_invocation_error returns None - this will just + # reraise the original error. + + error = self._handle_invocation_error(error, method, method_args) + if error is not None: + import sys + + raise error, None, sys.exc_info()[2] + raise + + def _handle_invocation_error(self, error, method_name, method_args): # RemoteObject + # Default behaviour - just reraise the old error. + return None + + # Called by the converter classes to determine the type of a remote + # attribute. + def _get_type_for_attribute(self, attrib_name, mapping_key=None): # RemoteObject + return None + + +class RemoteConstantsMetaclass(type): + def __init__(cls, name, bases, cls_dict): + super(RemoteConstantsMetaclass, cls).__init__(name, bases, cls_dict) + if hasattr(cls, '__az_constants__'): + for key, value in cls.__az_constants__.items(): + setattr(cls, key, value) + + +# This just used for interrogation purposes - the guts of this function will +# be used to build other functions (see below). +# +# Poor little function - ends up being consumed and tossed aside, like a +# Hollow devouring a human soul. +def _invoke_remote_method(self, *args, **kwargs): + from dopal.utils import handle_kwargs + + kwargs = handle_kwargs(kwargs, result_type=None) + return self.invoke_object_method(__funcname__, args, **kwargs) + + +from dopal.utils import MethodFactory + +_methodobj = MethodFactory(_invoke_remote_method) +make_instance_remote_method = _methodobj.make_instance_method +make_class_remote_method = _methodobj.make_class_method +del _methodobj, MethodFactory + +from dopal.aztypes import AzureusMethods + + +class RemoteMethodMetaclass(type): + def __init__(cls, name, bases, cls_dict): + super(RemoteMethodMetaclass, cls).__init__(name, bases, cls_dict) + + az_key = '__az_methods__' + if az_key not in cls_dict: + methodsobj = AzureusMethods() + for base in bases: + if hasattr(base, az_key): + methodsobj.update(getattr(base, az_key)) + setattr(cls, az_key, methodsobj) + else: + methodsobj = getattr(cls, az_key) + + # Create the real methods based on those in __az_methods__. + for method_name in methodsobj.get_method_names(): + if not hasattr(cls, method_name): + _mobj = make_class_remote_method(method_name, cls) + setattr(cls, method_name, _mobj) + + +class RemoteMethodMixin(object): + __use_dynamic_methods__ = False + __use_type_checking__ = True + + def __getattr__(self, name): + # Anything which starts with an underscore is unlikely to be a public + # method. + if (not name.startswith('_')) and self.__use_dynamic_methods__: + return self._get_remote_method_on_demand(name) + _superclass = super(RemoteMethodMixin, self) + + # Influenced by code here: + # http://aspn.activestate.com/ASPN/Mail/Message/python-list/1620146 + # + # The problem is that we can't use the super object to get a + # __getattr__ method for the appropriate class. + self_mro = list(self.__class__.__mro__) + for cls in self_mro[self_mro.index(RemoteMethodMixin) + 1:]: + if hasattr(cls, '__getattr__'): + return cls.__getattr__(self, name) + else: + # Isn't there something I can call to fall back on default + # behaviour? + text = "'%s' object has no attribute '%s'" + raise AttributeError, text % (type(self).__name__, name) + + # Used to create a remote method object on demand. + def _get_remote_method_on_demand(self, name): + return make_instance_remote_method(name, self) + + def invoke_object_method(self, method, method_args, result_type=None): + if self.__use_type_checking__: + try: + az_methods = self.__az_methods__ + except AttributeError: + if not self.__use_dynamic_methods__: + raise RuntimeError, "%s uses type checking, but has no methods to check against" % type( + self).__name__ + else: + try: + method_args, result_type = \ + az_methods.wrap_args(method, method_args) + except AzMethodError: + if not self.__use_dynamic_methods__: + raise + + return super(RemoteMethodMixin, self).invoke_object_method(method, method_args, result_type=result_type) + + +class RemoteAttributeMetaclass(type): + # XXX: What the hell is this meant to do!? + def __init__(cls, name, bases, cls_dict): + deft_names = '__default_remote_attribute_names__' + az_attrs = '__az_attributes__' + + attr_dict = cls_dict.setdefault(deft_names, {}) + attr_dict.update(cls_dict.get(az_attrs, {})) + + for base in bases: + attr_dict.update(getattr(base, deft_names, {})) + attr_dict.update(getattr(base, az_attrs, {})) + + setattr(cls, deft_names, attr_dict) + super(RemoteAttributeMetaclass, cls).__init__(name, bases, cls_dict) + + +class RemoteAttributesMixin(object): + __default_remote_attribute_names__ = {} + __reset_attributes_on_refresh__ = False + __protect_remote_attributes__ = True + + def __init__(self, *args, **kwargs): + # Class attribute becomes instance attribute. + super(RemoteAttributesMixin, self).__init__(*args, **kwargs) + self.__remote_attribute_names__ = self.__default_remote_attribute_names__.copy() + + def __getattr__(self, name): + if name in self.__remote_attribute_names__: + raise MissingRemoteAttributeError, name + + # Influenced by code here: + # http://aspn.activestate.com/ASPN/Mail/Message/python-list/1620146 + self_mro = list(self.__class__.__mro__) + for cls in self_mro[self_mro.index(RemoteAttributesMixin) + 1:]: + if hasattr(cls, '__getattr__'): + return cls.__getattr__(self, name) + else: + # Isn't there something I can call to fall back on default + # behaviour? + text = "'%s' object has no attribute '%s'" + raise AttributeError, text % (type(self).__name__, name) + + + def __setattr__(self, name, value): + if self.__protect_remote_attributes__ and not name.startswith('__'): + if name in self.__remote_attribute_names__: + err = "cannot set remote attribute directly: %s" + raise AttributeError, err % name + return super(RemoteAttributesMixin, self).__setattr__(name, value) + + def set_remote_attribute(self, name, value): + if name not in self.__remote_attribute_names__: + self.__remote_attribute_names__[name] = None + return super(RemoteAttributesMixin, self).__setattr__(name, value) + + def get_remote_attributes(self): + result = super(RemoteAttributesMixin, self).get_remote_attributes() + for attribute in self.__remote_attribute_names__: + if hasattr(self, attribute): + result[attribute] = getattr(self, attribute) + return result + + def is_remote_attribute(self, name): + return name in self.__remote_attribute_names__ + + def update_remote_data(self, remote_attribute_dict): + if self.__reset_attributes_on_refresh__: + for attrib in self.__remote_attribute_names__: + try: + delattr(self, attrib) + except AttributeError: + pass + + _super = super(RemoteAttributesMixin, self) + + # XXX: Do a better fix than this! + pra_value = self.__protect_remote_attributes__ + self.__protect_remote_attributes__ = False + try: + return _super.update_remote_data(remote_attribute_dict) + finally: + self.__protect_remote_attributes__ = pra_value + + def _get_type_for_attribute(self, name, mapping_key=None): + if mapping_key is not None: + key_to_use = name + ',' + mapping_key + else: + key_to_use = name + result = self.__remote_attribute_names__.get(key_to_use) + if result is not None: + return result + else: + import dopal + + if dopal.__dopal_mode__ == 1: + raise RuntimeError, (self, key_to_use) + _superfunc = super(RemoteAttributesMixin, self)._get_type_for_attribute + return _superfunc(name, mapping_key) + + +class AzureusObjectMetaclass(RemoteConstantsMetaclass, RemoteMethodMetaclass, RemoteAttributeMetaclass): + pass + + +class AzureusObject(RemoteAttributesMixin, RemoteMethodMixin, RemoteObject): + __metaclass__ = AzureusObjectMetaclass + + def _get_self_from_root_object(self, plugin_interface): + # XXX: Err, this is a bit incorrect - it should be get_remote_type. + # But it will do for now. Need to think more carefully about + # the responsibilities of the two methods. + if hasattr(self, 'get_xml_type'): + from dopal.persistency import get_equivalent_object_from_root + + return get_equivalent_object_from_root(self, plugin_interface) + return super(AzureusObject, self)._get_self_from_root_object(plugin_interface) + + +class TypelessRemoteObject(RemoteAttributesMixin, RemoteMethodMixin, RemoteObject): + __use_dynamic_methods__ = True + + +TYPELESS_CLASS_MAP = {None: TypelessRemoteObject} + +# XXX: Define converter here? +# Add type checking code (though this proably should be core) +# Add some code to read data from statistics file (what level should this be at?) +# # Allow some code to make link_error_handler assignable +# Converter - needs to have some default behaviours (easily changeable): +# a) Atoms - what to do if no type is suggested. (not so important this one) +# b) Objects - what to do if no class is given (if no id is given?) diff --git a/resources/utorrent/dopal/objects.pyc b/resources/utorrent/dopal/objects.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93c61df3eefb9cc976908925e27a32d313a56d22 GIT binary patch literal 20626 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 literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/objects.pyo b/resources/utorrent/dopal/objects.pyo new file mode 100644 index 0000000000000000000000000000000000000000..16a5ee57b47192f30fdd43eb907ef5b695554f4b GIT binary patch literal 20440 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 (2, 4, 0, 0) + + repeatable = self.default_repeatable_alerts + + alert_code = { + 'warn': self.log_channel.LT_WARNING, + 'error': self.log_channel.LT_ERROR, + }.get(alert_type, self.log_channel.LT_INFORMATION) + + if repeatable: + _log = self.log_channel.logAlertRepeatable + else: + _log = self.log_channel.logAlert + + import dopal.errors + + try: + _log(alert_code, message) + except dopal.errors.DopalError: + pass + + def log_channel(self): + if hasattr(self, '_log_channel_factory'): + return self._log_channel_factory() + return None + + log_channel = _lazyattr(log_channel) + + +def _zunpickle(byte_data): + import pickle, zlib + + return pickle.loads(zlib.decompress(byte_data)) + + +def _zpickle(data_object): + import pickle, zlib + + return zlib.compress(pickle.dumps(data_object)) + + +# +# Methods for manipulating the default connection data. +# + +def input_connection_data(): + print + print 'Enter the default connection data to be used for scripts.' + print + save_file = save_connection_data(ask_for_connection_data()) + print + print 'Data saved to', save_file + + +def ask_for_connection_data(): + connection_details = {} + connection_details['host'] = raw_input('Enter host: ') + port_text = raw_input('Enter port (default is 6884): ') + if port_text: + connection_details['port'] = int(port_text) + + # Username and password. + username = raw_input('Enter user name (leave blank if not applicable): ') + password = None + if username: + import getpass + + connection_details['user'] = username + password1 = getpass.getpass('Enter password: ') + password2 = getpass.getpass('Confirm password: ') + if password1 != password2: + raise ValueError, "Password mismatch!" + connection_details['password'] = password1 + + # Additional information related to the connection. + print + print 'The following settings are for advanced connection configuration.' + print 'Just leave these values blank if you are unsure what to set them to.' + print + additional_details = {} + additional_details['persistent'] = raw_input( + "Enable connection persistency [type 'no' to disable]: ") != 'no' + + timeout_value = raw_input('Set socket timeout (0 to disable, blank to use script default): ') + if timeout_value.strip(): + additional_details['timeout'] = int(timeout_value.strip()) + + return connection_details, additional_details + + +def save_connection_data(data_dict): + ss = ScriptEnvironment(None, 'connection.dpl') + ss.save_data(data_dict) + return ss.get_data_file_path() + + +def load_connection_data(error=True): + ss = ScriptEnvironment(None, 'connection.dpl') + data = ss.load_data() + if data is None and error: + from dopal.errors import NoDefaultScriptConnectionError + + raise NoDefaultScriptConnectionError, "No default connection data found - you must run dopal.scripting.input_connection_data(), or if you are running as a script, use the --setup-connection parameter." + return data + + +def get_stored_connection(): + return _get_connection_from_config(None, None, None, False, False) + + +def _sys_exit(exitcode, message=''): + import sys + + if message: + print >> sys.stderr, message + sys.exit(exitcode) + + +def _press_any_key_to_exit(): + # We use getpass to swallow input, because we don't want to echo + # any nonsense that the user types in. + print + import getpass + + getpass.getpass("Press any key to exit...") + + +def _configure_logging(script_env, setup_logging): + try: + import logging + except ImportError: + return False + + if setup_logging is False: + import dopal.logutils + + dopal.logutils.noConfig() + elif setup_logging is True: + logging.basicConfig() + else: + log_ini = script_env.get_log_config_path(create_dir=False) + if not os.path.exists(log_ini): + log_ini = ScriptEnvironment(None).get_log_config_path(create_dir=False) + if os.path.exists(log_ini): + import logging.config + + logging.config.fileConfig(log_ini) + else: + import dopal.logutils + + dopal.logutils.noConfig() + + return True + + +def _create_handlers(script_env, log_to_file, log_file, log_to_azureus): + try: + import logging.handlers + except ImportError: + return [] + + created_handlers = [] + + if log_to_file: + if log_file is None: + log_file = script_env.get_log_path() + handler = logging.handlers.RotatingFileHandler(log_file, maxBytes=2000000) + created_handlers.append(handler) + + return created_handlers + + +def _get_remote_logger(script_env, use_own_log_channel): + import dopal.errors, types + + try: + logger = script_env.connection.getPluginInterface().getLogger() + channel_by_name = dict([(channel.getName(), channel) for channel in logger.getChannels()]) + + if isinstance(use_own_log_channel, types.StringTypes): + log_channel_name = use_own_log_channel + elif use_own_log_channel: + log_channel_name = name + else: + log_channel_name = 'DOPAL Scripts' + + # Reuse an existing channel, or create a new one. + if log_channel_name in channel_by_name: + return channel_by_name[log_channel_name] + else: + return logger.getChannel(log_channel_name) + except dopal.errors.DopalError, e: + + # Not too sure about this at the moment. It's probably better to + # provide some way to let errors escape. + import dopal + + if dopal.__dopal_mode__ == 1: + raise + return None + + +def _get_connection_from_config(script_env, connection, timeout, establish_connection, silent_on_connection_error): + import dopal.errors + + if script_env is None: + logger = None + else: + logger = script_env.logger + + extended_settings = {} + if connection is None: + if logger: + logger.debug("No connection explicitly defined, attempting to load DOPAL scripting default settings.") + connection_details, extended_settings = load_connection_data() + if logger: + logger.debug("Connection settings loaded, about to create connection.") + + import dopal.main + + connection = dopal.main.make_connection(**connection_details) + if logger: + logger.debug("Connection created. Processing advanced settings...") + + if timeout is not None: + timeout_to_use = timeout + elif extended_settings.has_key('timeout'): + timeout_to_use = extended_settings['timeout'] + else: + timeout_to_use = None + + if timeout_to_use is not None: + + # This is how we distinguish between not giving a value, and turning + # timeouts off - 0 means don't use timeouts, and None means "don't do + # anything". + if timeout_to_use == 0: + timeout_to_use = None + + if logger: + logger.debug("Setting timeout to %s." % timeout_to_use) + import socket + + try: + socket.setdefaulttimeout(timeout_to_use) + except AttributeError: # Not Python 2.2 + pass + + connection.is_persistent_connection = extended_settings.get('persistent', True) + + if not establish_connection: + return connection + + if logger: + logger.debug("About to establish connection to %s." % connection.get_cgi_path(auth_details=True)) + + try: + connection.establish_connection() + except dopal.errors.LinkError: + if silent_on_connection_error: + if logger: + logger.info("Failed to establish connection.", exc_info=1) + return None + else: + if logger: + logger.exception("Failed to establish connection.") + raise + else: + if logger: + logger.debug("Connection established.") + return connection + + +def ext_run(name, function, + + # Connection related. + connection=None, make_connection=True, + + # Connection setup. + timeout=15, + + # Remote logging related. + use_repeatable_remote_notification=None, use_own_log_channel=False, + remote_notify_on_run=False, remote_notify_on_error=True, + + # Local logging related. + logger=None, setup_logging=None, log_to_file=False, log_level=None, + log_file=None, + + # Exit behaviour. + silent_on_connection_error=False, pause_on_exit=0, print_error_on_pause=1): + ''' + Prepares a L{ScriptEnvironment} object based on the settings here, and + executes the passed function. + + You may alternatively want to use the L{run} function if you don't wish + to determine the environment settings to run in, and would prefer the + settings to be controlled through arguments on the command line. + + @note: If passing additional arguments, you must use named arguments, + and not rely on the position of the arguments, as these arguments may + be moved or even completely removed in later releases. + + @param name: The I{name} of the script - used for storing data, log files + and so on. + + @param function: The callable object to invoke. Must take one argument, + which will be the L{ScriptEnvironment} instance. + + @param connection: The + L{AzureusObjectConnection} object + to use - if C{None} is provided, one will be automatically determined + for you. + + @param make_connection: Determines whether the C{scripting} module + should attempt to create a connection based on the default connection + details or not. Only has an effect if the C{connection} parameter is + C{None}. + + @param timeout: Defines how long socket operations should wait before + timing out for (in seconds). Specify C{0} to disable timeouts, the + default is C{15}. Specifying C{None} will resort to using the default + timeout value specified in the connection details. + + @param use_repeatable_remote_notification: Determines whether the + L{alert} method should use repeatable + notification by default or not (see L{ScriptEnvironment.alert}). + + @param use_own_log_channel: Determines what log channel to use. The default + behaviour is to use a log channel called "C{DOPAL Scripts}". Passing a + string value will result in logging output being sent to a channel with + the given name. Passing C{True} will result in a channel being used + which has the same name as the script. + + @param remote_notify_on_run: Determines whether to send + L{alert} calls when the script starts and ends. + Normally, this is only desired when testing that the script is working. + + @param remote_notify_on_error: Determines whether to send an alert to the + Azureus connection if an error has occurred during the script's + execution. + + @param logger: The C{logging.Logger} instance to log to - the root logger + will be used by default. Will be C{None} if the C{logging} module is not + available on the system. + + @param setup_logging: Determines whether automatically set up logging with + the C{logging.Logger} module. If C{True}, C{logging.basicConfig} will be + called. If C{False}, L{dopal.logutils.noConfig} will be called. If + C{None} (default), then this module will look for file named C{log.ini}, + firstly in the script's data directory and then in the global DOPAL + scripts directory. If such a file can be found, then + C{logging.fileConfig} will be invoked, otherwise + L{dopal.logutils.noConfig} will be called instead. + + @param log_to_file: If C{True}, then a C{RotatingFileHandler} will log to a + file in the script's data directory. + + @param log_level: The logging level assigned to any logger or handlers + I{created} by this function. + + @param log_file: If C{log_to_file} is C{True}, this parameter + specifies determines which file to log to (default is that the script + will determine a path automatically). + + @param silent_on_connection_error: If C{True}, this function will silently + exit if a connection cannot be established with the stored connection + object. Otherwise, the original error will be raised. + + @param pause_on_exit: If set to C{0} (default), then after execution of the + script has occurred, the function will immediately return. If C{1}, the + script will wait for keyboard input before terminating. If C{2}, the + script will wait for keyboard input only if an error has occurred. + + @param print_error_on_pause: If C{pause_on_exit} is enabled, this flag + determines whether any traceback should be printed. If C{0}, no + traceback will be printed. If C{1} (default), any error which occurs + inside this function will be printed. If C{2}, only tracebacks which have + occurred in the script will be printed. If C{3}, only tracebacks which + have occurred outside of the script's invocation will be printed. + + @raises ScriptFunctionError: Any exception which occurs in the + function passed in will be wrapped in this exception. + ''' + + from dopal.errors import raise_as, ScriptFunctionError + + try: + + # This will be eventually become a parameter on this method in a later + # version of DOPAL, so I'll declare the variable here and program the + # code with it in mind. + log_to_azureus = False + + # All data for the script will be stored here. + script_env = ScriptEnvironment(name) + + # First step, initialise the logging environment. + # + # We do this if we have not been passed a logger object. + if logger is None: + + # We don't call this method if we have been specifically + # asked to construct handlers from these function arguments. + # + # (Currently, that's just "log_to_file" that we want to check.) + if log_to_file: + logging_configured_by_us = False + + # We want to log to Azureus, but we can't set that up yet, because + # we don't have a connection set up (probably). Adding a logging + # handler is the last thing we do before invoking the script, because + # we don't want to log any scripting initialisation messages here + # remotely (we only want to log what the script wants to log). + elif log_to_azureus: + logging_configured_by_us = _configure_logging(script_env, False) + + # Configure using the setup_logging flag. + else: + logging_configured_by_us = _configure_logging(script_env, setup_logging) + + if logging_configured_by_us: + import logging + + logger = logging.getLogger() + + if log_level is not None: + logger.setLevel(log_level) + + else: + logging_configured_by_us = False + + script_env.logger = logger + + set_levels_on_handlers = \ + (log_level is not None) and (not logging_configured_by_us) + + del logging_configured_by_us + + # Setup all handlers, apart from any remote handlers... + for handler in _create_handlers(script_env, log_to_file, log_file, None): + if set_levels_on_handlers: + handler.setLevel(log_level) + + # Next step, sort out a connection (if we need to). + if connection is None and make_connection: + connection = _get_connection_from_config(script_env, None, timeout, True, silent_on_connection_error) + + # If connection is None, that means that we failed to establish a + # connection, but we don't mind, so just return silently. + if connection is None: + return + + # Assign connection if we've got one. + if connection is not None: + script_env.connection = connection + + # Next step, setup a remote channel for us to communicate with Azureus. + if connection is not None: + def make_log_channel(): + return _get_remote_logger(script_env, use_own_log_channel) + + script_env._log_channel_factory = make_log_channel + + script_env.default_repeatable_alerts = use_repeatable_remote_notification + + # Configure remote handlers at this point. + for handler in _create_handlers(script_env, False, None, log_to_azureus): + if set_levels_on_handlers: + handler.setLevel(log_level) + + if remote_notify_on_run: + script_env.alert('About to start script "%s"...' % name, repeatable=True) + + try: + function(script_env) + except Exception, e: + if logger: + logger.exception("Error occurred inside script.") + + # Do we want to notify Azureus? + if remote_notify_on_error: + script_env.alert( + 'An error has occurred while running the script "%s".\nPlease check any related logs - the script\'s data directory is located at:\n %s' % ( + script_env.name, script_env.get_data_dir(create_dir=False)), alert_type='error') + + raise_as(e, ScriptFunctionError) + + if remote_notify_on_run: + script_env.alert('Finished running script "%s".' % name, repeatable=True) + + # Error during execution. + except: + + if pause_on_exit: + + # Do we want to log the exception? + import sys + + _exc_type, _exc_value, _exc_tb = sys.exc_info() + if isinstance(_exc_value, ScriptFunctionError): + _print_tb = print_error_on_pause in [1, 2] + + # If we are printing the traceback, we do need to print the + # underlying traceback if we have a ScriptFunctionError. + _exc_value = _exc_value.error + _exc_type = _exc_value.__class__ + else: + _print_tb = print_error_on_pause in [1, 3] + + if _print_tb: + import traceback + + traceback.print_exception(_exc_type, _exc_value, _exc_tb) + _press_any_key_to_exit() + + # Reraise the original error. + raise + + # Script finished cleanly, just exit normally. + else: + if pause_on_exit == 1: + _press_any_key_to_exit() + + +def run(name, function): + ''' + Main entry point for script functions to be executed in a preconfigured + environment. + + This function wraps up the majority of the functionality offered by + L{ext_run}, except it allows it to be configured through command line + arguments. + + This function requires the C{logging} and C{optparse} (or C{optik}) modules + to be present - if they are not (which is the case for a standard Python + 2.2 distribution), then a lot of the configurability which is normally + provided will not be available. + + You can find all the configuration options that are available by running + this function and passing the C{--help} command line option. + + There are several options available which will affect how the script is + executed, as well as other options which will do something different other + than executing the script (such as configuring the default connection). + + This script can be passed C{None} as the function value - this will force + all the command line handling and so on to take place, without requiring + a script to be executed. This is useful if you want to know whether + calling this function will actually result in your script being executed - + for example, you might want to print the text C{"Running script..."}, but + only if your script is actually going to executed. + + This function does not return a value - if this method returns cleanly, + then it means the script has been executed (without any problems). This + function will raise C{SystemExit} instances if it thinks it is appropriate + to do so - this is always done if the script actually fails to be executed. + + The exit codes are:: + 0 - Exit generated by optparse (normally when running with C{--help}). + 2 - Required module is missing. + 3 - No default connection stored. + 4 - Error parsing command line arguments. + 5 - Connection not established. + 16 - Script not executed (command line options resulted in some other behaviour to occur). + + If an exception occurs inside the script, it will be passed back to the + caller of this function, but it will be wrapped in a + L{ScriptFunctionError} instance. + + If any exception occurs inside the script, in this function, or in + L{ext_run}, it will be passed back to the caller of this function (rather + than being suppressed). + + @note: C{sys.excepthook} may be modified by this function to ensure that + an exception is only printed once to the user with the most appopriate + information. + ''' + + EXIT_TRACEBACK = 1 + EXIT_MISSING_MODULE = 2 + EXIT_NO_CONNECTION_STORED = 3 + EXIT_OPTION_PARSING = 4 + EXIT_COULDNT_ESTABLISH_CONNECTION = 5 + EXIT_SCRIPT_NOT_EXECUTED = 16 + + def abort_if_no_connection(): + if load_connection_data(error=False) is None: + _sys_exit(EXIT_NO_CONNECTION_STORED, + "No connection data stored, please re-run with --setup-connection.") + + try: + from optik import OptionGroup, OptionParser, OptionValueError, TitledHelpFormatter + except ImportError: + try: + from optparse import OptionGroup, OptionParser, OptionValueError, TitledHelpFormatter + except ImportError: + import sys + + if len(sys.argv) == 1: + abort_if_no_connection() + if function is not None: + ext_run(name, function) + return + + _module_msg = "Cannot run - you either need to:\n" + \ + " - Install Python 2.3 or greater\n" + \ + " - the 'optik' module from http://optik.sf.net\n" + \ + " - Run with no command line arguments." + _sys_exit(EXIT_MISSING_MODULE, _module_msg) + + # Customised help formatter. + # + # Why do we need one? We don't. + # Why do *I* want one? Here's why: + # + class DOPALCustomHelpFormatter(TitledHelpFormatter): + + # + # 1) Choice options which I create will have a metavar containing + # a long string of all the options that can be used. If it's + # bunched together with other options, it doesn't read well, so + # I want an extra space. + # + def format_option(self, option): + if option.choices is not None: + prefix = '\n' + else: + prefix = '' + + return prefix + TitledHelpFormatter.format_option(self, option) + + # + # 2) I don't like the all-lower-case "options" header, so we + # capitalise it. + # + def format_heading(self, heading): + if heading == 'options': + heading = 'Options' + return TitledHelpFormatter.format_heading(self, heading) + + # + # 3) I don't like descriptions not being separated out from option + # strings, hence the extra space. + # + def format_description(self, description): + result = TitledHelpFormatter.format_description(self, description) + if description[-1] == '\n': + result += '\n' + return result + + parser = OptionParser(formatter=DOPALCustomHelpFormatter(), usage='%prog [options] [--help]') + + def parser_error(msg): + import sys + + parser.print_usage(sys.stderr) + _sys_exit(EXIT_OPTION_PARSING, msg) + + parser.error = parser_error + + # We want to raise a different error code on exit. + + def add_option(optname, options, help_text, group=None): + + options_processing = [opt.lower() for opt in options] + + # This is the rest of the help text we will generate. + help_text_additional = ': one of ' + \ + ', '.join(['"%s"' % option for option in options]) + '.' + + if group is not None: + parent = group + else: + parent = parser + + parent.add_option( + '--' + optname, + type="choice", + metavar='[' + ', '.join(options) + ']', + choices=options_processing, + dest=optname.replace('-', '_'), + help=help_text, # + help_text_additional, + ) + + logging_group = OptionGroup(parser, "Logging setup options", + "These options will configure how logging is setup for the script.") + parser.add_option_group(logging_group) + + add_option( + 'run-mode', + ['background', 'command', 'app'], + 'profile to run script in' + ) + + add_option( + 'logging', + ['none', 'LOCAL'], # , 'remote', 'FULL'], + 'details where the script can send log messages to', + logging_group, + ) + + add_option( + 'loglevel', + ['debug', 'info', 'WARN', 'error', 'fatal'], + 'set the threshold level for logging', + logging_group, + ) + + add_option( + 'logdest', + ['FILE', 'stderr'], + 'set the destination for local logging output', + logging_group, + ) + + logging_group.add_option('--logfile', type='string', help='log file to write out to') + + add_option( + 'needs-connection', + ['YES', 'no'], + 'indicates whether the ability to connect is required, if not, then it causes the script to terminate cleanly', + ) + + add_option( + 'announce', + ['yes', 'ERROR', 'no'], + 'indicates whether the user should be alerted via Azureus when the script starts and stops (or just when errors occur)' + ) + + add_option( + 'pause-on-exit', + ['yes', 'error', 'NO'], + 'indicates whether the script should pause and wait for keyboard input before terminating' + ) + + connection_group = OptionGroup(parser, "Connection setup options", + "These options are used to set up and test your own personal " + "connection settings. Running with any of these options will cause " + "the script not to be executed.\n") + + connection_group.add_option('--setup-connection', action="store_true", + help="Setup up the default connection data for scripts.") + + connection_group.add_option('--test-connection', action="store_true", + help="Test that DOPAL can connect to the connection configured.") + + connection_group.add_option('--delete-connection', action="store_true", + help="Removes the stored connection details.") + + script_env_group = OptionGroup(parser, "Script setup options", + "These options are used to extract and set information related to " + "the environment set up for the script. Running with any of these " + "options will cause the script not to be executed.\n") + + script_env_group.add_option('--data-dir-info', action="store_true", + help="Prints out where the data directory is for this script.") + + parser.add_option_group(connection_group) + parser.add_option_group(script_env_group) + + options, args = parser.parse_args() + + # We don't permit an explicit filename AND a conflicting log destination. + if options.logdest not in [None, 'file'] and options.logfile: + parser.error("cannot set conflicting --logdest and --logfile values") + + # We don't allow any command line argument which will make us log to file + # if local logging isn't enabled. + if options.logging not in [None, 'local', 'full'] and \ + (options.logdest or options.logfile or options.loglevel): + parser.error("--logging setting conflicts with other parameters") + + # Want to know where data is kept? + if options.data_dir_info: + def _process_senv(senv): + def _process_senv_file(fpath_func, descr): + fpath = fpath_func(create_dir=False) + print descr + ':', + if not os.path.exists(fpath): + print '(does not exist)', + print + print ' "%s"' % fpath + print + + if senv.name is None: + names = [ + 'Global data directory', + 'Global default connection details', + 'Global logging configuration file', + ] + else: + names = [ + 'Script data directory', + 'Script data file', + 'Script logging configuration file', + ] + + _process_senv_file(senv.get_data_dir, names[0]) + _process_senv_file(senv.get_data_file_path, names[1]) + _process_senv_file(senv.get_log_config_path, names[2]) + + _process_senv(ScriptEnvironment(None, 'connection.dpl')) + _process_senv(ScriptEnvironment(name)) + _sys_exit(EXIT_SCRIPT_NOT_EXECUTED) + + # Delete connection details? + if options.delete_connection: + conn_path = ScriptEnvironment(None, 'connection.dpl').get_data_file_path(create_dir=False) + if not os.path.exists(conn_path): + print 'No stored connection data file found.' + else: + try: + os.remove(conn_path) + except OSError, error: + print 'Unable to delete "%s"...' % conn_path + print ' ', error + else: + print 'Deleted "%s"...' % conn_path + _sys_exit(EXIT_SCRIPT_NOT_EXECUTED) + + # Do we need to setup a connection. + if options.setup_connection: + input_connection_data() + _sys_exit(EXIT_SCRIPT_NOT_EXECUTED) + + # Want to test the connection? + if options.test_connection: + abort_if_no_connection() + connection = get_stored_connection() + + print 'Testing connection to', connection.link_data['host'], '...' + import dopal.errors + + try: + connection.establish_connection(force=False) + except dopal.errors.LinkError, error: + print "Unable to establish a connection..." + print " Destination:", connection.get_cgi_path(auth_details=True) + print " Error:", error.to_error_string() + _sys_exit(EXIT_SCRIPT_NOT_EXECUTED) + else: + print "Connection established, examining XML/HTTP plugin settings..." + + # While we're at it, let the user know whether their settings are + # too restrictive. + # + # XXX: We need a subclass of RemoteMethodError representing + # Access Denied messages. + from dopal.errors import NoSuchMethodError, RemoteMethodError + + # Read-only methods? + try: + connection.get_plugin_interface().getTorrentManager() + except RemoteMethodError: + read_only = True + else: + read_only = False + + # XXX: Some sort of plugin utility module? + if read_only: + print + print 'NOTE: The XML/HTTP plugin appears to be set to read-only - this may restrict' + print ' scripts from working properly.' + _sys_exit(EXIT_SCRIPT_NOT_EXECUTED) + + # Generic classes became the default immediately after 2.4.0.2. + if connection.get_azureus_version() > (2, 4, 0, 2): + generic_classes = True + generic_classes_capable = True + elif connection.get_azureus_version() < (2, 4, 0, 0): + generic_classes = False + generic_classes_capable = False + else: + generic_classes_capable = True + try: + connection.get_plugin_interface().getLogger() + except NoSuchMethodError: + generic_classes = False + else: + generic_classes = True + + if not generic_classes: + print + if generic_classes_capable: + print 'NOTE: The XML/HTTP plugin appears to have the "Use generic classes"' + print ' setting disabled. This may prevent some scripts from running' + print ' properly - please consider enabling this setting.' + else: + print 'NOTE: This version of Azureus appears to be older than 2.4.0.0.' + print ' This may prevent some scripts from running properly.' + print ' Please consider upgrading an updated version of Azureus.' + else: + print 'No problems found with XML/HTTP plugin settings.' + + _sys_exit(EXIT_SCRIPT_NOT_EXECUTED) + + # Is the logging module available? + try: + import logging + except ImportError: + logging_available = False + else: + logging_available = True + + # Now we need to figure out what settings have been defined. + # + # In level of importance: + # - Option on command line. + # - Default options for chosen profile. + # - Default global settings. + + # Global default settings. + settings = { + 'logging': 'none', + 'needs_connection': 'yes', + 'announce': 'error', + 'pause_on_exit': 'no', + } + + # Profile default settings. + # + # I'll only define those settings which differ from the global defaults. + settings.update({ + 'background': { + 'needs_connection': 'no' + }, + 'command': { + 'logging': 'none', + 'announce': 'no', + }, + 'app': { + 'logging': 'none', + 'pause_on_exit': 'error', + 'announce': 'no', + }, + None: {}, + }[options.run_mode]) + + # Explicitly given settings. + for setting_name in settings.keys(): + if getattr(options, setting_name) is not None: + settings[setting_name] = getattr(options, setting_name) + + # Ensure that the user doesn't request logging settings which we can't + # support. + # + # logdest = file or stderr + # logfile = blah + # logging -> if local, then log to (default) file. + if not logging_available and \ + (options.loglevel is not None or \ + settings['logging'] != 'none' or \ + options.logfile or options.logdest): + _module_msg = "Cannot run - you either need to:\n" + \ + " - Install Python 2.3 or greater\n" + \ + " - the 'logging' module from http://www.red-dove.com/python_logging.html\n" + \ + " - Run the command again without --loglevel or --logging parameters" + _sys_exit(EXIT_MISSING_MODULE, _module_msg) + + # What log level to use? + loglevel = None + if options.loglevel is not None: + loglevel = getattr(logging, options.loglevel.upper()) + + # Now we interpret the arguments given and execute ext_run. + kwargs = {} + kwargs['silent_on_connection_error'] = settings['needs_connection'] == 'no' + kwargs['pause_on_exit'] = {'yes': 1, 'no': 0, 'error': 2}[settings['pause_on_exit']] + + kwargs['remote_notify_on_run'] = settings['announce'] == 'yes' + kwargs['remote_notify_on_error'] = settings['announce'] in ['yes', 'error'] + + # Logging settings. + if options.logdest == 'stderr': + setup_logging = True + logging_to_stderr = True + else: + setup_logging = None + logging_to_stderr = False + + kwargs['setup_logging'] = setup_logging + kwargs['log_level'] = loglevel + kwargs['log_to_file'] = options.logdest == 'file' or \ + options.logfile is not None + kwargs['log_file'] = options.logfile + + # print_error_on_pause: + # Do we want to print the error? That's a bit tough... + # + # If we know that we are logging to stderr, then any internal script + # error will already be printed, so we won't want to do it in that case. + # + # If an error has occurred while setting up, we will let it be printed + # if we pause on errors, but then we have to suppress it from being + # reprinted (through sys.excepthook). Otherwise, we can let sys.excepthook + # handle it. + # + # If we aren't logging to stderr, and an internal script error occurs, + # we can do the same thing as we currently do for setting up errors. + # + # However, if we are logging to stderr, we need to remember that setting + # up errors aren't fed through to the logger, so we should print setting + # up errors. + if logging_to_stderr: + # Print only initialisation errors. + kwargs['print_error_on_pause'] = 3 + else: + # Print all errors. + kwargs['print_error_on_pause'] = 1 + + print_traceback_in_ext_run = kwargs['pause_on_exit'] and kwargs['print_error_on_pause'] + abort_if_no_connection() + + from dopal.errors import LinkError, ScriptFunctionError + + # Execute script. + if function is not None: + try: + ext_run(name, function, **kwargs) + except LinkError, error: + print "Unable to establish a connection..." + print " Connection:", error.obj + print " Error:", error.to_error_string() + _sys_exit(EXIT_SCRIPT_NOT_EXECUTED) + except: + # Override sys.excepthook here. + # + # It does two things - firstly, if we know that the traceback + # has already been printed to stderr, then we suppress it + # being printed again. Secondly, if the exception is a + # ScriptFunctionError, it will print the original exception + # instead. + import sys + + previous_except_hook = sys.excepthook + + def scripting_except_hook(exc_type, exc_value, exc_tb): + + is_script_function_error = False + if isinstance(exc_value, ScriptFunctionError): + exc_value = exc_value.error + exc_type = exc_value.__class__ + is_script_function_error = True + + if logging_to_stderr and is_script_function_error: + # Only script function errors will be logged to the + # logger, so we'll only suppress the printing of this + # exception if the exception is a scripting function + # error. + return + if print_traceback_in_ext_run: + return + previous_except_hook(exc_type, exc_value, exc_tb) + + sys.excepthook = scripting_except_hook + raise + + return + + +if __name__ == '__main__': + SCRIPT_NAME = 'scripting_main' + + # Verify that the command line arguments are accepted. + run(SCRIPT_NAME, None) + + # Set up two scripts, one which should work, and the other which will fail. + # We add in some delays, just so things don't happen too quickly. + print 'The following code will do 2 things - it will run a script which' + print 'will work, and then run a script which will fail. This is for' + print 'testing purposes.' + print + + def do_something_good(script_env): + print "DownloadManager:", script_env.connection.get_plugin_interface().getDownloadManager() + + def do_something_bad(script_env): + print "UploadManager:", script_env.connection.get_plugin_interface().getUploadManager() + + print 'Running good script...' + run(SCRIPT_NAME, do_something_good) + print + + print 'Finished running good script, waiting for 4 seconds...' + import time + + time.sleep(4) + print + + print 'Running bad script...' + run(SCRIPT_NAME, do_something_bad) + print diff --git a/resources/utorrent/dopal/utils.py b/resources/utorrent/dopal/utils.py new file mode 100644 index 0000000..aa4f42d --- /dev/null +++ b/resources/utorrent/dopal/utils.py @@ -0,0 +1,195 @@ +# File: utils.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +''' +General utility functions. +''' + +__pychecker__ = 'unusednames=metaclass_,attr_,no-unreachable' + +# Converts a binary string character into a hexidecimal equivalent. +# +# >>> byte_to_hex_form('N') +# u'4E' +def byte_to_hex_form(byte): + # ord is used to convert the byte into it's numeric equivalent. + # hex will turn the number into a string like "0x5" or "0xa3" + # the slicing will chop off the "0x" prefix. + # zfill will change any single digit values to have a leading 0 character. + # upper will force all the A-F characters to be uppercase. + return unicode(hex(ord(byte))[2:].zfill(2).upper()) + + +# Converts a binary string into a hexidecimal equivalent. +# +# >>> string_to_hex_form('xK3-') +# u'784B332D' +def string_to_hex_form(chars): + if not chars: + raise ValueError, "cannot convert empty string" + return ''.join([byte_to_hex_form(char) for char in chars]) + + +# Converts a 2 character hexidecimal string into a binary character. +# +# >>> hex_form_to_byte(u'4E') +# 'L' +def hex_pair_to_byte(hex_pair): + return chr(int(hex_pair.encode('utf-8'), 16)) + + +# Converts a hexidecimal string (a string containing only characters valid +# in use for displaying a hexidecimal number, i.e. 0123456789ABCDEF) into +# a binary string. +# +# >>> hex_string_to_binary(u'784B332D') +# 'xK3-' +def hex_string_to_binary(hex_string): + if len(hex_string) % 2: + raise ValueError, "string given has odd-number of characters, must be even" + if not hex_string: + raise ValueError, "cannot convert empty string" + return ''.join([hex_pair_to_byte(hex_string[i:i + 2]) for i in range(0, len(hex_string), 2)]) + + +def make_short_object_id(object_id): + # Due to the way Azureus generates object ID's (it tends to be a + # long integer which is then incremented for each object it + # generates), we don't bother rendering the entire object ID + # as it would be too long (it can be as long as 20 characters). + # + # So instead, we only use the last 6 digits - turning the ID into + # hexidecimal. This gives us a range of 16**6 = 16.7 million. So + # Azureus would have to generate more than 16 million objects + # before it generates an ID which has the same short ID form as + # another object. + # + # We show the short ID as a way of easily seeing whether two + # objects represent the same remote object or not. + hex_id = hex(object_id) + + if hex_id[-1] == 'L': + hex_short_id = hex_id[-7:-1] + else: + hex_short_id = hex_id[-6:] + + return hex_short_id + + +def parse_azureus_version_string(ver_string): + ver_bits = ver_string.split('_', 2) + if len(ver_bits) == 1: + major_ver, minor_ver = ver_string, None + else: + major_ver, minor_ver = ver_bits + + ver_segments = [int(bit) for bit in major_ver.split('.')] + if minor_ver: + if minor_ver[0].lower() == 'b': + ver_segments.append('b') + try: + beta_ver = int(minor_ver[1:]) + except ValueError: + pass + else: + ver_segments.append(beta_ver) + + return tuple(ver_segments) + +# +# I love this code. :) +# +# I might turn it into something more generic, and use it elsewhere.. +# +# Would be nicer if there was a better API for doing this, but given the amount +# of hackery that I'm doing right now, I won't complain. :) +# +# What a lot of effort just to act as if these methods were defined in the +# class itself. +import new + + +class MethodFactory(object): + def __init__(self, method_object): + _codeobj = method_object.func_code + code_arguments = [ + _codeobj.co_argcount, _codeobj.co_nlocals, _codeobj.co_stacksize, + _codeobj.co_flags, _codeobj.co_code, _codeobj.co_consts, + _codeobj.co_names, _codeobj.co_varnames, _codeobj.co_filename, + _codeobj.co_name, _codeobj.co_firstlineno, _codeobj.co_lnotab, + ] + self.code_arguments = code_arguments + + def _build_function(self, name): + code_args = self.code_arguments[:] + code_args[9] = name + # code_args[8] = + codeobj = new.code(*code_args) + return new.function(codeobj, {'__funcname__': name, '__builtins__': __builtins__}, name) + + def make_instance_method(self, name, instanceobj): + method = self._build_function(name) + return new.instancemethod(method, instanceobj, type(instanceobj)) + + def make_class_method(self, name, classobj): + method = self._build_function(name) + return new.instancemethod(method, None, classobj) + + +def _not_implemented(self, *args, **kwargs): + class_name = self.__class__.__name__ + funcname = __funcname__ + raise NotImplementedError, "%(class_name)s.%(funcname)s" % locals() + + +not_implemented_factory = MethodFactory(_not_implemented) +make_not_implemented_class_method = not_implemented_factory.make_class_method +del _not_implemented, not_implemented_factory + + +def handle_kwargs(kwargs, *required, **optional): + result = {} + result.update(optional) + + required_args = dict([(x, None) for x in required]) + + for kwarg_key, kwarg_value in kwargs.iteritems(): + if optional.has_key(kwarg_key): + pass + else: + try: + required_args.pop(kwarg_key) + except KeyError: + raise TypeError, "unexpected keyword argument: %r" % kwarg_key + + result[kwarg_key] = kwarg_value + + if required_args: + missing_key = required_args.popitem()[0] + raise TypeError, "missing keyword argument: %r" % missing_key + + return result + + +class Sentinel(object): + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return '' % (self.value, id(self)) diff --git a/resources/utorrent/dopal/utils.pyc b/resources/utorrent/dopal/utils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..49d8748c47445460751a2f97a60d3b4b6c8c5e2e GIT binary patch literal 6687 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 literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/utils.pyo b/resources/utorrent/dopal/utils.pyo new file mode 100644 index 0000000000000000000000000000000000000000..fb06851507d386c6926cbaedfa0fcc8e3d7d92a6 GIT binary patch literal 6687 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 A{Qv*} literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/xmlutils.py b/resources/utorrent/dopal/xmlutils.py new file mode 100644 index 0000000..3b3d01b --- /dev/null +++ b/resources/utorrent/dopal/xmlutils.py @@ -0,0 +1,214 @@ +# File: xmlutils.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +''' +XML utility functions. +''' + +# Given an object which has the same interface as xml.dom.Node: +# a) Join all concurrent text nodes together. +# b) Strip all trailing and leading whitespace from each text node. +# +# This function will recursively process the tree structure given in the node +# object. No value will be returned by this function, instead the given object +# will be modified. +def normalise_xml_structure(xml_node): + # Concurrent text nodes should be joined together. + xml_node.normalize() + + # Strip all text nodes which are empty of content (whitespace is not + # content). + from xml.dom import Node + + nodes_to_delete = [] + + for node in xml_node.childNodes: + if node.nodeType == Node.TEXT_NODE: + stripped_text = node.nodeValue.strip() + if stripped_text: + node.nodeValue = stripped_text + else: + nodes_to_delete.append(node) + else: + normalise_xml_structure(node) + + for node in nodes_to_delete: + xml_node.removeChild(node) + node.unlink() + + +def get_text_content(node): + from xml.dom import Node + + # Text content is stored directly in this node. + if node.nodeType == Node.TEXT_NODE: + return node.nodeValue + + # Otherwise, must be in a child node. + #elif len(node.childNodes) == 1 and \ + # node.firstChild.nodeType == Node.TEXT_NODE: + # return node.firstChild.nodeValue + + # Sometimes happens for attributes with no real value. + elif len(node.childNodes) == 0: + return '' + + text_node = None + err_text = None + for child in node.childNodes: + if child.nodeType == Node.TEXT_NODE: + if text_node is None: + text_node = child + else: + err_text = "contained multiple text nodes" + break + else: + if text_node is None: + if len(node.childNodes) != 1: + err_text = "contained multiple nodes, but none were text" + else: + err_text = "did not contain a character string as its value" + else: + return text_node.nodeValue + + raise ValueError, ("the node %s " % node.nodeName) + err_text + + +from xml.sax.saxutils import quoteattr, escape + +# This base class will be removed when XMLObject is removed. +class _XMLObjectBase(object): + def __init__(self, tag_name): + self.tag_name = tag_name + self.attributes = {} + self.contents = [] + + def add_attribute(self, attribute_name, attribute_value): + self.attributes[attribute_name] = attribute_value + + def add_content(self, content): + self.contents.append(content) + + def to_string(self, out=None, indent=0): + if out is None: + # We use StringIO instead of cStringIO not to lose unicode strings. + import StringIO + + out = StringIO.StringIO() + return_as_string = True + else: + return_as_string = False + + indent_string = ' ' * indent + out.write(indent_string) + out.write('<') + out.write(self.tag_name) + for attr_name, attr_value in self.attributes.items(): + out.write(' ') + out.write(attr_name) + out.write('=') + out.write(quoteattr(attr_value)) + + # If we have no contents, we'll close the tag here. + if not self.contents: + out.write(' />\n') + + else: + out.write('>') + + # If we have one piece of content, which is just a string, then + # we'll put it on the same line as the opening tag is on. + if len(self.contents) == 1 and not hasattr(self.contents[0], 'to_string'): + out.write(escape(self.contents[0])) + + # Otherwise, we assume we have some more XML blocks to write out, + # so we'll indent them and put them on newlines. + elif self.contents: + out.write('\n') + for content in self.contents: + content.to_string(out, indent + 2) + out.write(indent_string) + + # Write out the closing tag (if we haven't written it already). + if self.contents: + out.write('\n') + + # If the invocation of this method was not passed a buffer to write + # into, then we return the string representation. + if return_as_string: + return out.getvalue() + + return None + + +class XMLObject(_XMLObjectBase): + ''' + B{Deprecated:} An object representing a block of XML. + + @attention: B{Deprecated:} This class does not provide any guarantees in + the way that byte strings are handled. Use L{UXMLObject} instead. + ''' + + def __init__(self, tag_name): + from dopal.errors import DopalPendingDeprecationWarning + + import warnings + + warnings.warn("XMLObject is deprecated - use UXMLObject instead", DopalPendingDeprecationWarning) + + _XMLObjectBase.__init__(self, tag_name) + + +class UXMLObject(_XMLObjectBase): + ''' + An object representing a block of XML. + + Any string which is added to this block (either through the L{add_content} + or L{add_attribute} methods should be a unicode string, rather than a byte + string. If it is a byte string, then it must be a string which contains + text in the system's default encoding - attempting to add text encoding in + other formats is not allowed. + ''' + + def to_string(self, out=None, indent=0): + result = _XMLObjectBase.to_string(self, out, indent) + if result is None: + return None + return unicode(result) + + def encode(self, encoding='UTF-8'): + return (('\n' % encoding) + self.to_string()).encode(encoding) + + def __unicode__(self): + return self.to_string() + + +def make_xml_ref_for_az_object(object_id): + ''' + Creates an XML block which represents a remote object in Azureus with the given object ID. + + @param object_id: The object ID to reference. + @type object_id: int / long + @return: A L{UXMLObject} instance. + ''' + object_id_block = UXMLObject('_object_id') + object_id_block.add_content(str(object_id)) + + object_block = UXMLObject('OBJECT') + object_block.add_content(object_id_block) + return object_block diff --git a/resources/utorrent/dopal/xmlutils.pyc b/resources/utorrent/dopal/xmlutils.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e19938d54112994eff56fbfdc490557a5c8ef391 GIT binary patch literal 6780 zcmc&(&2Jn@6|bHdk7p+K#_VoBcF961Brq(A6FwxCkPka{A_ao8v>g(RL#s1gw%eKM z9(UEm_HKp)yGR_6_8;KJ5phGDKu8E7E?hZq;Km&ZafaXTRnK_L?uAS2Y}Isqy?XWP zef(Z+^_rPfgg>O*`4DyhgvMI}|0)Ks^sdNs9PQ@ts* zKBaeNPt+r>$##vOY z$KScH2QKZV?m%x2vW`ph%+9wu0S2c~$n+A5{S~SgO6|z*0T>6%-9Ys!Y8a?sOQ~T+ z?f+1wRMqm6RW+=t7ge=WQ!fIwGo_wYRAHs3u6Cw*gdv7%s_3xB%&4w*hw4Q|?KIf@ z091G1R<1eGc(i|!6PBO6CDg%9Yc$HOPLOJ_`&0D@(p_zn^_BEL_-petuEutrnDz`? zO;lN4^x|&%o^jJ??f1I#N!|i-zfU>s#;U6J-(9ba+3Z?eRlk=3%7H4*lSFlEqjgTlBI7%NOKe{Pnzoh%z<-86gF zCN0^SE4aI7?W9lxSCPx3#B_}_ayHIzafpC6(R8*V46(ht?E!V=?Ka z*~VhOzZ|=GBg|tow>G|=C+S9zXX&Z)tUz5sMNVxlSOz5KzyTpo) z=irP7@aNH(nWyNmycQLFTn%1Fw?Fm{lp&BHJaKp~3qQk(@|4T<5@7f&@BDa<$tcQW zmQ27dMu!xaDtFA7L?2!5G*#-j&Q)3c|x55RnVHFVLA7#laydg&V)i&Lw52cPyN=toR>KnGko+~$7(!42A(}!8= z0}zxCc$N!WDK%WI`iTLiuUF)&mUXeN@j!wLU z#4GglZ1@K0i1EMEKz`_|HE-NiS!&!vSbMiYI zoT)YuT4!sQg12f-899r#|C+1SgH~mwO&28Mi{zA1BylNBM%@B{{ulx9K>@z4!pXvC~fvoGEdp)iHqS zcAO<$lgw+RCi?#S567n;f`kP;O6G--1T5M!?O_SUE}%M+F2LEa4Ob2q>s>kU4?f^x zF$S}RV}W~tH)0zTSKFjGfy5n+beSp5yGY(3qLCCKjYn~jp~qgulrfhY0!hY_)|d4F z$2dI1=nMkA;99{kiO&Pm=7kNvi4IZRy^^-L7B)iahv==aD6YV}7On|zpgL6Em#McJ zJO2Vj^cJWWhC5gBJideO@EfSa!9`J$cS_qkWc8)n*){O~?eZ#(U5Q>OrE zkovhCR)dze(zZ!qO9i@$e6Y1GhIRk_3FtGFt@8qQbOiSeHK6)-o>*9VE=>h;A%K?FF9&wa-;O6QUb!<&4`LB0w(F|m!i z-Fy!YMK+XZF9?v=&$7g8Vj_%Gn?P6G0X+mTp7@N!!@`SnB&$Gv{yl1x1CWHbO~!1G z4S4gVFei+aY7~AIl|*j%T%7UH4qm3olGERylqP!$k+v3C!r_N&cQ3yqo|VyqMZ`nj z15XM+d75ZUp8d{@vjQJ#R_q1Lx_%2UKl(WymEa(6od5Ft)$`+fym9`bJ%0-*igZ21 zVdf>5XeJVf#;6l_e>?)>p?`}q%8eLrM@0nELdRGVBURuGk0RuY>EN-jFVBckRBB)p z{T_^zC-KlI96RRl7I_}SpOA+O?;K%Vj_@+Ia{=4`62$|dX1#K6s+Z#K_1FPyHPUOavB^qKzxSki|5 literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/xmlutils.pyo b/resources/utorrent/dopal/xmlutils.pyo new file mode 100644 index 0000000000000000000000000000000000000000..e19938d54112994eff56fbfdc490557a5c8ef391 GIT binary patch literal 6780 zcmc&(&2Jn@6|bHdk7p+K#_VoBcF961Brq(A6FwxCkPka{A_ao8v>g(RL#s1gw%eKM z9(UEm_HKp)yGR_6_8;KJ5phGDKu8E7E?hZq;Km&ZafaXTRnK_L?uAS2Y}Isqy?XWP zef(Z+^_rPfgg>O*`4DyhgvMI}|0)Ks^sdNs9PQ@ts* zKBaeNPt+r>$##vOY z$KScH2QKZV?m%x2vW`ph%+9wu0S2c~$n+A5{S~SgO6|z*0T>6%-9Ys!Y8a?sOQ~T+ z?f+1wRMqm6RW+=t7ge=WQ!fIwGo_wYRAHs3u6Cw*gdv7%s_3xB%&4w*hw4Q|?KIf@ z091G1R<1eGc(i|!6PBO6CDg%9Yc$HOPLOJ_`&0D@(p_zn^_BEL_-petuEutrnDz`? zO;lN4^x|&%o^jJ??f1I#N!|i-zfU>s#;U6J-(9ba+3Z?eRlk=3%7H4*lSFlEqjgTlBI7%NOKe{Pnzoh%z<-86gF zCN0^SE4aI7?W9lxSCPx3#B_}_ayHIzafpC6(R8*V46(ht?E!V=?Ka z*~VhOzZ|=GBg|tow>G|=C+S9zXX&Z)tUz5sMNVxlSOz5KzyTpo) z=irP7@aNH(nWyNmycQLFTn%1Fw?Fm{lp&BHJaKp~3qQk(@|4T<5@7f&@BDa<$tcQW zmQ27dMu!xaDtFA7L?2!5G*#-j&Q)3c|x55RnVHFVLA7#laydg&V)i&Lw52cPyN=toR>KnGko+~$7(!42A(}!8= z0}zxCc$N!WDK%WI`iTLiuUF)&mUXeN@j!wLU z#4GglZ1@K0i1EMEKz`_|HE-NiS!&!vSbMiYI zoT)YuT4!sQg12f-899r#|C+1SgH~mwO&28Mi{zA1BylNBM%@B{{ulx9K>@z4!pXvC~fvoGEdp)iHqS zcAO<$lgw+RCi?#S567n;f`kP;O6G--1T5M!?O_SUE}%M+F2LEa4Ob2q>s>kU4?f^x zF$S}RV}W~tH)0zTSKFjGfy5n+beSp5yGY(3qLCCKjYn~jp~qgulrfhY0!hY_)|d4F z$2dI1=nMkA;99{kiO&Pm=7kNvi4IZRy^^-L7B)iahv==aD6YV}7On|zpgL6Em#McJ zJO2Vj^cJWWhC5gBJideO@EfSa!9`J$cS_qkWc8)n*){O~?eZ#(U5Q>OrE zkovhCR)dze(zZ!qO9i@$e6Y1GhIRk_3FtGFt@8qQbOiSeHK6)-o>*9VE=>h;A%K?FF9&wa-;O6QUb!<&4`LB0w(F|m!i z-Fy!YMK+XZF9?v=&$7g8Vj_%Gn?P6G0X+mTp7@N!!@`SnB&$Gv{yl1x1CWHbO~!1G z4S4gVFei+aY7~AIl|*j%T%7UH4qm3olGERylqP!$k+v3C!r_N&cQ3yqo|VyqMZ`nj z15XM+d75ZUp8d{@vjQJ#R_q1Lx_%2UKl(WymEa(6od5Ft)$`+fym9`bJ%0-*igZ21 zVdf>5XeJVf#;6l_e>?)>p?`}q%8eLrM@0nELdRGVBURuGk0RuY>EN-jFVBckRBB)p z{T_^zC-KlI96RRl7I_}SpOA+O?;K%Vj_@+Ia{=4`62$|dX1#K6s+Z#K_1FPyHPUOavB^qKzxSki|5 literal 0 HcmV?d00001 diff --git a/resources/utorrent/net.py b/resources/utorrent/net.py new file mode 100644 index 0000000..8778133 --- /dev/null +++ b/resources/utorrent/net.py @@ -0,0 +1,1064 @@ +# -*- coding: utf-8 -*- + +import os +import sys +import time +import re +import urllib +import urllib2 +import cookielib +import base64 +import mimetools +import json +import itertools + +import xbmc +import xbmcaddon +import xbmcgui +import xbmcplugin +import xbmcvfs + + +os.sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)))) + +import dopal.main + +__plugin__ = sys.modules["__main__"].__plugin__ +__settings__ = sys.modules["__main__"].__settings__ +ROOT = sys.modules["__main__"].__root__ # .decode('utf-8').encode(sys.getfilesystemencoding()) +userStorageDirectory = __settings__.getSetting("storage") +USERAGENT = "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0" +URL = 'http://torrenter.host.org' +torrentFilesDirectory = 'torrents' +__addonpath__ = __settings__.getAddonInfo('path') +icon = __addonpath__ + '/icon.png' + +RE = { + 'content-disposition': re.compile('attachment;\sfilename="*([^"\s]+)"|\s') +} + +# ################################ +# +# HTTP +# +# ################################ + +class HTTP: + def __init__(self): + self._dirname = xbmc.translatePath('special://temp') # .decode('utf-8').encode('cp1251') + for subdir in ('xbmcup', sys.argv[0].replace('plugin://', '').replace('/', '')): + self._dirname = os.path.join(self._dirname, subdir) + if not xbmcvfs.exists(self._dirname): + xbmcvfs.mkdir(self._dirname) + + + def fetch(self, request, **kwargs): + self.con, self.fd, self.progress, self.cookies, self.request = None, None, None, None, request + + if not isinstance(self.request, HTTPRequest): + self.request = HTTPRequest(url=self.request, **kwargs) + + self.response = HTTPResponse(self.request) + + # Debug('XBMCup: HTTP: request: ' + str(self.request)) + + try: + self._opener() + self._fetch() + except Exception, e: + xbmc.log('XBMCup: HTTP: ' + str(e), xbmc.LOGERROR) + if isinstance(e, urllib2.HTTPError): + self.response.code = e.code + self.response.error = e + else: + self.response.code = 200 + + if self.fd: + self.fd.close() + self.fd = None + + if self.con: + self.con.close() + self.con = None + + if self.progress: + self.progress.close() + self.progress = None + + self.response.time = time.time() - self.response.time + + xbmc.log('XBMCup: HTTP: response: ' + str(self.response), xbmc.LOGDEBUG) + + return self.response + + + def _opener(self): + + build = [urllib2.HTTPHandler()] + + if self.request.redirect: + build.append(urllib2.HTTPRedirectHandler()) + + if self.request.proxy_host and self.request.proxy_port: + build.append(urllib2.ProxyHandler( + {self.request.proxy_protocol: self.request.proxy_host + ':' + str(self.request.proxy_port)})) + + if self.request.proxy_username: + proxy_auth_handler = urllib2.ProxyBasicAuthHandler() + proxy_auth_handler.add_password('realm', 'uri', self.request.proxy_username, + self.request.proxy_password) + build.append(proxy_auth_handler) + + if self.request.cookies: + self.request.cookies = os.path.join(self._dirname, self.request.cookies) + self.cookies = cookielib.MozillaCookieJar() + if os.path.isfile(self.request.cookies): + self.cookies.load(self.request.cookies) + build.append(urllib2.HTTPCookieProcessor(self.cookies)) + + urllib2.install_opener(urllib2.build_opener(*build)) + + + def _fetch(self): + params = {} if self.request.params is None else self.request.params + + if self.request.upload: + boundary, upload = self._upload(self.request.upload, params) + req = urllib2.Request(self.request.url) + req.add_data(upload) + else: + + if self.request.method == 'POST': + if isinstance(params, dict) or isinstance(params, list): + params = urllib.urlencode(params) + req = urllib2.Request(self.request.url, params) + else: + req = urllib2.Request(self.request.url) + + for key, value in self.request.headers.iteritems(): + req.add_header(key, value) + + if self.request.upload: + req.add_header('Content-type', 'multipart/form-data; boundary=%s' % boundary) + req.add_header('Content-length', len(upload)) + + if self.request.auth_username and self.request.auth_password: + req.add_header('Authorization', 'Basic %s' % base64.encodestring( + ':'.join([self.request.auth_username, self.request.auth_password])).strip()) + + # self.con = urllib2.urlopen(req, timeout=self.request.timeout) + self.con = urllib2.urlopen(req) + self.response.headers = self._headers(self.con.info()) + + if self.request.download: + self._download() + else: + self.response.body = self.con.read() + + if self.request.cookies: + self.cookies.save(self.request.cookies) + + + def _download(self): + fd = open(self.request.download, 'wb') + if self.request.progress: + self.progress = xbmcgui.DialogProgress() + self.progress.create(u'Download') + + bs = 1024 * 8 + size = -1 + read = 0 + name = None + + if self.request.progress: + if 'content-length' in self.response.headers: + size = int(self.response.headers['content-length']) + if 'content-disposition' in self.response.headers: + r = RE['content-disposition'].search(self.response.headers['content-disposition']) + if r: + name = urllib.unquote(r.group(1)) + + while 1: + buf = self.con.read(bs) + if buf == '': + break + read += len(buf) + fd.write(buf) + + if self.request.progress: + self.progress.update(*self._progress(read, size, name)) + + self.response.filename = self.request.download + + + def _upload(self, upload, params): + res = [] + boundary = mimetools.choose_boundary() + part_boundary = '--' + boundary + + if params: + for name, value in params.iteritems(): + res.append([part_boundary, 'Content-Disposition: form-data; name="%s"' % name, '', value]) + + if isinstance(upload, dict): + upload = [upload] + + for obj in upload: + name = obj.get('name') + filename = obj.get('filename', 'default') + content_type = obj.get('content-type') + try: + body = obj['body'].read() + except AttributeError: + body = obj['body'] + + if content_type: + res.append([part_boundary, + 'Content-Disposition: file; name="%s"; filename="%s"' % (name, urllib.quote(filename)), + 'Content-Type: %s' % content_type, '', body]) + else: + res.append([part_boundary, + 'Content-Disposition: file; name="%s"; filename="%s"' % (name, urllib.quote(filename)), '', + body]) + + result = list(itertools.chain(*res)) + result.append('--' + boundary + '--') + result.append('') + return boundary, '\r\n'.join(result) + + + def _headers(self, raw): + headers = {} + for line in raw.headers: + pair = line.split(':', 1) + if len(pair) == 2: + tag = pair[0].lower().strip() + value = pair[1].strip() + if tag and value: + headers[tag] = value + return headers + + + def _progress(self, read, size, name): + res = [] + if size < 0: + res.append(1) + else: + res.append(int(float(read) / (float(size) / 100.0))) + if name: + res.append(u'File: ' + name) + if size != -1: + res.append(u'Size: ' + self._human(size)) + res.append(u'Load: ' + self._human(read)) + return res + + def _human(self, size): + human = None + for h, f in (('KB', 1024), ('MB', 1024 * 1024), ('GB', 1024 * 1024 * 1024), ('TB', 1024 * 1024 * 1024 * 1024)): + if size / f > 0: + human = h + factor = f + else: + break + if human is None: + return (u'%10.1f %s' % (size, u'byte')).replace(u'.0', u'') + else: + return u'%10.2f %s' % (float(size) / float(factor), human) + + +class HTTPRequest: + def __init__(self, url, method='GET', headers=None, cookies=None, params=None, upload=None, download=None, + progress=False, auth_username=None, auth_password=None, proxy_protocol='http', proxy_host=None, + proxy_port=None, proxy_username=None, proxy_password='', timeout=20.0, redirect=True, gzip=False): + if headers is None: + headers = {} + + self.url = url + self.method = method + self.headers = headers + + self.cookies = cookies + + self.params = params + + self.upload = upload + self.download = download + self.progress = progress + + self.auth_username = auth_username + self.auth_password = auth_password + + self.proxy_protocol = proxy_protocol + self.proxy_host = proxy_host + self.proxy_port = proxy_port + self.proxy_username = proxy_username + self.proxy_password = proxy_password + + self.timeout = timeout + + self.redirect = redirect + + self.gzip = gzip + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, ','.join('%s=%r' % i for i in self.__dict__.iteritems())) + + +class HTTPResponse: + def __init__(self, request): + self.request = request + self.code = None + self.headers = {} + self.error = None + self.body = None + self.filename = None + self.time = time.time() + + def __repr__(self): + args = ','.join('%s=%r' % i for i in self.__dict__.iteritems() if i[0] != 'body') + if self.body: + args += ',body=' + else: + args += ',body=None' + return '%s(%s)' % (self.__class__.__name__, args) + + +class UTorrent: + def config(self, login, password, host, port, url=None): + self.login = login + self.password = password + + self.url = 'http://' + host + if port: + self.url += ':' + str(port) + self.url += '/gui/' + + self.http = HTTP() + + self.re = { + 'cookie': re.compile('GUID=([^;]+);'), + 'token': re.compile("]+id='token'[^>]*>([^<]+)

    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 LNkvXXu0mjf=PS~| literal 0 HcmV?d00001 diff --git a/resources/searchers/icons/rutracker.org.png b/resources/searchers/icons/rutracker.org.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5ab9eb9ffc78fcfd35fca1095f0c5a80625720 GIT binary patch literal 50598 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≪KMlfvh?D1@1!Xzc zU$?sUk8ocT6=;5@F9CN@6ZZx3ObZSep$mN%U{+k!GvaxFPy5g>$SH>7(B?Pkl%&*d z`Wl!oKgQ3)(CF6I-p4@rk8_%TlmmgpR6Z7393F7)0RY&iXT?c^eM!|7+P>xVhCGAg zKJ2_R>oHq0W=fAn(Oi*x*YfK8Z(;^5cKTtpD=T0;{ihKpIGbMvs(91h_Q&2n)cr?z z%>cLIy|ba$G(}05R5?C_pAAA935J>0V6;ju>n(E_*Iu(?-ftwR`7!K>EQAX?q=X`9L%*A?@Z)tVvKyHDi3BZeD6!wQxWe%rG%;|} z(TO3~p~Jn-HwBtMDBAqzDFF13ogGuHBhk30D&MSVD7M`U0C0fQd%>B$A8BYwj#0m? zCjYnf#kNml6xyk3-E(5_iDUiaF9V?Ohu?Gr zv;VNKfF}^)(|9L*EObnd@+sCtqM19*_#xM)y95xYTC;4teJ^*TMTaArVklJhOa_C&{+O0{xc z;qPid`0;$up6?y?c6X0>_5mO)wdm9i{ye#fI_M+}J-Ow`eTTXk;YVlR$aEW?%3$|m ze*J>7+-n^sZS#+w-SM#%H3c`9<``~US(ASSu!05ii>x2zEH#F|=cljb7e>mcSWA%bblbl4oglGbMfXl2?C*pJ>s8PvCRi5b*0D!kR=T41_{ zTJ&T_K&8Gq$r6&23*&Gcc#}ve4G1EzdtFU}(}wt8f*Bx6C$N$bOd~%fp`==++|F0_ z;b~#FA=nF@ZGB^#InygJQ|*r+1i-yA$Ec|Qkg>vddC3gwC+2D?VLue-7(NAHd#5K5 z{=SC=fEi~>ey9Q9Y*}&%Ww9F6<*_(Ts`D)?x3%^aL}GD2NtFYovb&#|k`$*-5lG^L^w*KOUU2CGTgs=u5H{T#=;m?DnQ-Zxa zQGfr|q3)Ml%u`B$G&WTMzgA3BMmS|1}pkmHr$D81YR;PJ-KJ zc5Mql1D%fOu-3`Lt4KE$%1USO|8(KN9;B!|jt@LHorphzx%k#|IhQ2Xh z&kP(oDH{$a>NXVTd;+w-5*<`(m7HvC>Dk&orVHwS3BsWT_RTi(oQA>@VJQKf%JBI{AQYRU%wPa+dIXFWQVY8oTk}QG7^Vxl3=*>_x z)+w<4CkZbCk6xoB>5)uKv@+|IrFehb$22TWkkc3eKxPFdi@m~Odd#F()&A>1_pkSN z4F8e41|D)A4oW$#0B|a8qE2-sSlj<2#dgE8NGzVx2?uObhAk8X}h zV*=Z70n-o!1PAD_Z}XwHiz|2AzA`haRslv0wYC3+sO^kq}ih zt+;186CnNXWM6`0(hq)|N-0B{@7r>?ck|l^yPkG>gDoUEs3b^|6^n7LN}i~2nDbWD z6#TZK#C~-!5@j4^7{uV6lDq`V*`cQ+?;js{k<*-6b09F1;0c5$i8Xd!0zfR|+L!VE znmM<>d7p(wDOUsFK2U5kEPr!<=dbsi7`&eo{%K7*5dbo2G@0}RIVm=GoXA(y-Za-*ZZ8{^Hqv`T|RR@nEbPHUg5&VGW#R>W?eli{DRIxtfPTFPMS4m_H_(z0l{t~ z$?{@4>+hAA{FFZ&m0R`dYR1nZlWI;U^~dYdT%Plt#!~y$2f9Xffbc)W0oE8fi3BbY z00`40;{!PEwB@)^CrjmO)hCFSdNGy8$ z#^wj~8ih4HhuM@gcO8(q9PJ-F^6H-U#}0Qp-y&?pBEW5QzABFqHUv4mQ*a82d65CLF18vX$|OF5fXv7{>R-_QiXdL3-S33@m2@~-0# z9qM-eS))`WK6SzTua`Sa3jqMo!6VP~BV$$@6H4R(4L(dEml#0!<)}e-wDoTr829hx zgl5{JmQ16^n2x%Xgfx^{udXSuu07H_dibUb>VDubX-d$?K+Tch^P$RdU&!^wzK*}Y z)6(+{98Wh%Zu9^LU@54LiBSv6b8fz7dChO66s3=Ft0n* zSaTvcmFFB^i**y}&!SnNQ_J)9YIzYK!69?lsYpVxW+GFus8!W0tZ>`|*GJaU?c6cw z^6w|f0jcM8ccSyo35c7eEXTCAI^TQ=<21u|+OWa4xAlXm?nI3gXzLq$DG-i*1q5yt zP~eBMX>RmvhlMPL#>_VoM^Hd54ch-X&i418>_$N$&&|==E@>{iGagS+<+;W>WCV=x zQ*#4|Xm;Rj_wj)p&+Rz+2e8fe2<&n`yp`a+;7IpNbBtun7n0T%*}nPFh2=j0fs|k$ z1PM3pj6!WcQDK;LG9qXOBGCvs5;>p9l=K-HiB74Q)UN@r0WdTyfmS4#<|{GpoI3o_ z90c7^nP>jw(yII)Akc&&ar$7_$Sbgi_}}!rpOAEV89?HL370OebbJ;zmJEdmH?%ht z4Qy%ceVVWZIb(rvBnq0avntQLT&q%)`a==Ewmvc0K2JRdc-`~izu|N*Docv*%(XsikK=S84C_6)we`_0hkKrauNxAWEI}gh zsv~1sGry40iok57ORMvLdO=$UL)Bg`#*<(YK|LZt{0z$Dy5E?*bn>zC$e71#{T>l;fRhSO3YuyqW(_rq;72Z%FH zR~7-_ELjG%55?g&sX0t&NoC>V^+I0=Z{}G8MQsxJqlJIj*IHd0_ zUC#Yaz1#ZxzEP$Lsas&zrqF#nmNoN>NWMi&2FCo##!~zJiz*$rV!c7OZb}q8;bs;{^wcnt=Uyp4`&<(63+F{Y?;l?7KJ2-P}UT&pY}qUQkL3EPB+&hPqv?}=- z^!~A4cF?9pyq6dI@wN4i?&3Bi@8!lO9`>#g&k?XIo%JR5@B7F4U)p}O?+K1ccr$H29b60iU@S<&W7BIC^2--hd>2@VVlKS>j4&ri zg+1>tSc*vN^pzN`f3l#bemO0uCZxDRA~Zer93R{YAl$9$IlR0-hZ?Qy#IdII4{ zU6F0=t9v>uzMQDgCs;&g(d=`;a52`a#JtpP-8?HPTaB-@XdOLVQnb;{aP5p(aS6ifB-5k;Q)#{+ zrVTnpGfJqys=uKo-||bXT9Jc^Rj44a)HoPPgx)&T{SaKbe(rjG=z0{MH%>qzBTYA|LE!WKV1Fuq6Nji$jQAgBS1T1D>Q zSkwnH>FOAA?*Rs|peo<8-0A7tMY2r9kuw!@GP0~DZxNUbcP*~WyZk`s@V+r`aFE-W zDgE=?{S&QJBQUWG+(dRA*Np?0&bc|8E@a z|4=#p&KLlk$)=ztt&-$fv{mfL?gVjqf9FtC24gjz_-Jyx>r`TpBYw8LyG3X0R ztMYyZHn1LnNs{i>p9Tzsjf0S`pBNZF-ah2o!%^rNbr55{DlIm##J_u-o?Wg$C{UhjoUc{O^ZY?3Q zn5z$VvUcUX!v9%YU-bV7C(xK-H|hohiu|F799Y>M4JG#PN*JePBGqGFCsW&tj@lalA%qFp1=#Qu?vVQ5}rm`O} zc?^6uD&{Mo?GLPM%o`d7)9rbZ%ngZ>59vB@@&JZiJ{gYc;tOB8Mm%lYkDCGjUBhmi zOP>px1viy)$Q3wvw10eCeUbelgG!MP0C0qLBvXk3i;mb$n$;T@l-~{Xxy%y`k85CK z@)LFvi3CqeCpITvc8qtTpy`)Z=YQgcwROLN*UE&w{7zQTsjU796dXDZwtO&M_)$0v zYNd8do;vA(hBCt>&kcpo+48$gD@WrntNJGZ#~;TFL$ ze`tr3oHtHDPcW(nGoTFbM?r=3IlV_Y`afZtG>mQ zbV<3x+{A6Pc)mr4G5))5T3h$*v4QdZPj74e0nmDSqA3U1l6sBOkZx;Z#~ySvTJ>5| zTV!8w^Sb)qB?v7G#o|m9g8y$Of=;D5;ixG*fv8b^q42mj7#ZdP2?c3+O#uOoU;Nqi z4bQD_D84Pmguv)D%}*tJ`OPE(Ibjw_N&A4St;gv-zyWP!Cc>1}naM3IM#?p7E7{%x zOw4iGHsClx*`QIbT~KcS`S!N{zr*i~vkFq!7ITe)kV5xdv53)av%Gjk1u;suU1+xk%tjRU;sHrO%7~Q6=*bm57VgK zoSq;GndB2ItG|OobAI>go;$8uTK$CrtG+zFB$%3^7m(t@ZK&y!ZNUXUB+%c1abK?| z5aykdi5!!LfN8U+rqKFGX^yeZAC69ZR+`dJWhE4u#0=6C0-5=T@Il!0gRo6ALS&lI zA4Re^L&fV>;V?7FV+M_4aYe5Al29Z{a*Y}XXm&lAT_KVoQT=p42=1P zuU=Mjdy3b8h86(N7ckWJ)YjI=L945-Tv~NaARJ9I0VG(&(+3)!_h`p*4BAVVRp&ow z)T#>7U!Sz?GuZuUfWRo>w5em5Y~u$BZS5W9BQ4WX>8ZLJ;TsFB`uzDt*8i!obaBOR-aOFxTL9U`jb%9(CG%ok@{eeoW8Y%j%Z zvL=V!1`J_1#1@!L#Qcx;js0`nAO4!%pfmawW-51uE+;YN{z&`Hf4u@I7CDp(N@NhqHJl(leS7a{*y59wxE+C|opfN_Gv4k%Y zkLz|G8^GiqTBVTbKDoN~ZrEsskRYp(DN2V83ff;*;V{+rj(T6?z$BXPn8(Ke3<4nj z5_%?rpZ1Ux1PwNQ_=zotABZKGxq8lr|GEE53c2L|MHP+>!4O+p5RJtmLoWXb#5!OI zcV4ry=FWJWmP7^l2B}&+%>kHhE0KGAB**uO+VWet6zRn%Bw zzZ$@Hg|IgOZ>r$6m&qhx9Y_lOA<_*D&R1YHV2bbMRe7d6p4)NsPKi`v!sM(-EFtKC z%>AEYS>o;!L$6||WirD|MG*i_afQy%bl_-=#;gXa3n)+3Jt$Y6;r(_tqVjyZq#%AU_&zh?eVLF3(keg(Ni zssNKD4}|Dz*RGoPEzDD3n|P#t!6c!kvoixK3nRb^x*!0~@j=&ql5F@nB>LvuXu86>lXm13qQZ1@gcatvM`;PNciEu z3d_Dn+=0R417pH6<+v#R=Sdh4>8MUA(=g@$Y@)s~CIS#m|B(>@#sC0-Vs`U1lG#vT zIyg+)`Ff>XhwpDL&s_tXZ)AN_>6bF~@#BRP&48+WbF)SzFA9XB?ux-IykkfeeK|^yK9K6h?sB-02F9_mBCGk>uc%DHoa{p)9o_Ojt01p*}ieA%=wW ztwf^nkV-DI+`6IhNx4*7{J?8_uQqCxg|}a_;86epBW8If6MmA;7W{qpwh#SN&;v0d zihlCip8F_D>_FM3oDuVsgSrWVNX*@2kpXg6x@^YSgrxR+!E)HpLkj3k7bHA}>8LStjm zlG7V>J@)pY`v8>sIPD)4oEOMAJ#@I&`5M-_qktGR3O!r{w!nyM)REpWB*lA9QbUbN zZJQxjIdR@>p2MKaKi~^S28Di>Dg87FHa9=h4WILc!XtEs>yq^1C*trM=6?Q?rpIHk zgyi?H?YSH@yZ*L|7d)y{$*mEt1JuOz<=T_uv3degUkls)*iSwrt-d}~0MO&~ka2%d zi#6ZFE`R5^FVxHZ$PC3t4Peu2h{LFr0{Q5ozMJdf@X_hF8aMCU@F z+<|a!9BGn-n#7C{B)~+l-*QpI-EIA2yB>Uf-;Ef4{p>}Jf3O=>g&{7rnxazuDr`$Q z2{wQ^FyaZca3)$<6#MfG0I(29qm&n*po0J(f_*eb1Q~!xKTiyflj0mB*6hcFZ1jD#DG-CuH!-LqO zYV(1v*LEE3f0h$|enc0T6DG2;xg48m&~?SO!iD9z*Ya}@r(zb_KxaxHq#$cicV+ zlbZR_=B>TXZSc>Gauq}$z#J|t&^hgkVhUj})K-O*ylcdLgd~Sp(rL$IVrJ|`<9q@L zjRIU(WWN%G9}`+)4zsQ_kyZ0grlt`L2bwgtW!3qYZ`#w2MK~!l22dj(>>BYbuPMN8 z!c3vkR04`E%sYl$z0Yhv@*t;SQ|i>wk%nP1n_gXU%SDY3q6{znT7u!|p&^OV`MzHFZTddgBom$hf(ME`Qkd z;A{K757*^2U~I8ZuCBeew#c^9%jR3K$IZw51;>kF;Sq1pd8BuA8%Yi|O^9NDh5!J2 z^quY{mr8L4pwXyN=8kxR-u6NF``o6S1OU5_52_YcINZ@VlLm~MB~e>wEq9o;%}>AE zdJkyV)m8bHB@u3#P&Um^rD#WtLL_ja?{)9A^!zmtjvh{T21c+d$rtR-*6N!Qun~Au z?CEVs9_E^kx;VQv&Q7gWkzhEgDz+JJzqqONzwJg%G1L86@Tr*`c&Sdl%s{|{fpBW^ zBp{&KMk@nee?M2FKO_5p28;QM*Y)IN`wLtNwuggYfSF#@9t=Sg0hL0CTu-FP-iiYH$#+Twnl}1Dzx9 zjQN7cxs5rA>VXDU!Nwg21s~QARHxax4=gx3(mTdCMioPU zXBq&6o9T4jP^gS*MXgdUHN1O-8UEoi#MHiNqP@+B3|Eva%`hJeE~xR|Pb}dILjn+5K}w|5I21PDKWb z=^*wmKt?p=2@CiN5zQ!AhaC7;xRMlmg7eHlZ z2A1o;82@Op-RB@(O_Rkni<1JlYEOV4?uOv6-z6>ZPY6B_<=9! z<{34?*w{OGtZn^c`vT!uFG;o(7uT5t0CdWo&KslsHOhRf)qnoIV?XAoUP^-poIBq+ z#K%A{sz((T2t{`=XC6tNtIvCIJgT zA&KugKKMMJ5-Su!jQXLU;O#@*n>dd@((4Gm)}&JvT)S%C6CnImC)+-p%A)3H+LJ&y z5)5hexIZ*Vl9iTos#O7y>vD{mBJ2i?U6k|8+On@)x%e;5Wx1DPC1%PoWofC#RZP-H z`6<7cK?--81Ux>T!Aw z5J8~|fScj^)wPd+25e@-T{AR|GQ{uG8A3)zkcA2G0*8PUibVZx|MX2dPs$?=NVsZV z;b)LZ#S>ggFYDQ-GPRhe2uV*BW-ArJoErB9o!ukumTV4Tah)dsfTOxb+=0U!(r0b& zgk!A%1k90GBFvw6Ly7$(Dw$MH(^*t~7F&9%*CE)zMpoXkuHn02x2_~?UH~KUZeO_b zjeT7Y$feR0aKYrB{T)Ml0^um%Rx1pqjr!(w^}lZ_&AliXp5>%qD(S$?rsb)r7(td( zM8WchqkdpjqjLcO{JEo#!>U&k0L_gnYYRRXjKmWuo_%^oKg~o`K+Yupxb^@T_mE_z zqPWgS03gY%?;uGVeU;*b>l>4TP3efRoq!SwnN(e0V!u44M_+m-8JVmtvk8dMUS|63 z8#TGNUEK6Dtx8@ZxYpE`mhOl4bq;OOvdu{tt%?IRkM@o4=Inki0EpzX8yfFhSzCC6 zHyj}pHM=(9lT&!9j9@^K%sztb=g8Dk_ydvHv`so^>LXGqq}a?ATc_1rxwP`TPi|@b zu`d*HGHul|*kF^cxxg97e`DHSR5`^9mOC*>f zAqy*VHx}Cs%_lp(Xu77pSa?)dY+DRk{9f41IUEa+f>v@q_}adI2fBY8O#y7H4V2mk ze`AHBTPc^yZr`}z_v;%jZK*U(KE-X~hn28B`_uq3IJZwC zNI=NO2Brf6Cg*`|r52kD2OwU1^y+_PVfk<2PyMTV+JBsH*3X0A&X{c^c}54N0N5}c zynoc+;R!@~Ion_K{!ay%=i^CXLXB0YN|vuu%uo!QR;jQBLJ=?6)z>za8^Ir=<5N<5ZS$X5y`L|a% zO!NGqXi6IHOuh9?M`X}|IP(t7kods3Z+P>;u2-Y6MDW^G^FE6qwpc=tLKENfVP)=O+Nvx`xuPEG&0i{lll<{RBSNSeCOMhda};RA8p3z?zBbU(Tj! zA9A(C6Eka6A_Bm9xX=^dHR4IK0kwh@*bHWaM&Y=8N#(bf)f9XTwu~e}XP5iw!hSOW z3VdIJol-!W%r3+F0RbGq%_A^{`ISu-YccB&31H3x}FJ# z5*)~BK-)*+akBMr-?n#Jx;M4;jqMIbqFoxLOuu14=|>8!`igiWp3(~-BM79OH{Vde6Z2$2Zp(+gE&Y&AgvI^3Q|c>mKp!xnXVXFV@u;eTo@PK9!_r zc@Dc2g`=@}=df!ZNv8ga_Wy?s0MZxsgR|(ATCGx^^RZ>s|A9gh6%NJ7;QX7aO`p&y zHWScbscwvXeC50^UtH2$dK1Hb=ouVih9!kJIRhbA58DzxF4BJy0GNfs2b(rmA(zQf z8z%@oC-eAb>>Z?7XIF%^cR!PB)RjH=UfXv81fuyC-8_tXC1^Uce_;wRVy7KT$%s2R z0&L>Nmv4GwZ?s+e!z(4Nir_z4opvH3Q$b{eZZ~EtfQxF~Xl>`)4_ZO#KQO0FW?s3WI@gbePlrA^?a0Kp0x> z4MqwSpu0}GPa!q+gVYr7qXbL@VQd9bTscC(B62jCg_`tr72;2^{(EJo5 zyw!!4vNiJyzx>F*4*YM9QC)iNs@iX18#9_d1ou>xr$cj{=2$ zg|LG;_^v@2tKQtfNFPtXg^4xv4B$XWzaz24$v4%Y*?9^V)))WZp>F5)!@Z;1{`V6r zUeYLK+Ta{CkVSy)cDk`oVMw(9&oKbVRx3Y~_u-&UiG-R`3xoY{nMx>6<~fo@4N@s~ zDGy9EJ1mt-(%?k8-8}`^po0si=8XA*zQ1j0dFt&$-7k6qkrN!%=lcd^tj=RnW4)o{ zY|;}a%=D}Y0Mln5%ox4~AVFrq0QjV%HS>$FD07%r|LEy=ufKkE?e~gphH_u{)D!iv zd^ia9$-tPulLII*`|pDW0BVN$tLOkpLAJiYDzfRBkyo=PmeZ?d6adhg=D9vMWF1VY zF~+Sj#LzLy5KY7h(C;CSKkO;A8!D(wxfj&b=Y)1Xp2M!=gL|LY((=dlLDzPH#zz2P z!d;A6fWC&bPR1%GEEwwp;f+xeN_NuWdpOBBO`jCC#&0xhRkn{VD*y45TUvkESeml| zn7}6jX`xtQRDzntRzUhc76?1Np~wK4qdtWq0GxrvPPV}@VrtSk>>^g3nn)yb>!Jez zkn2?vi zzXSaaZGB^1!D!5_2UF-&t^)uJKW>el4On7V=1*N%|Es<2LtEW}ko&fan|_M}Jx|H* zPXl?7{((@0Y4{o!0pJ`m0r(`2U^q^WddKJ7L%*i3&}h;s?Welgm_ic?ro)ED-q_di zkCqQ@&3$r|d@W{9~*bCRe8cm!MV9(m| zrvz|XRGxdYS+8t(b!y)@8p6kr8t|G&X1MQ6EV*DiIxk=NbTOBa5UZ{aMt1ET`W54Jf-w~1P;l}u!G_pa|Vr4aZzLGudI4?NprcPNG78sQ+fPP z7XI;l?m&2$h_(N-T4!}JkYo;e269d`n_3|=;eehQZ4K@ri)Jd z1MT=jUBib!_}}N)1#aju4gg{rm7F%|R3z7=rBq5;y;3eyEvn4>%*N*O+ryDKQeXm) z8-Vc?61EY^gs={~17ITu#)SSwdWPCpD3oBF$Y!!{m=;KI-e8)1X@0Toauj;_97#$B z<{UCd{H`%?uwTH$L=ZTa831ZS9FTFU1_276L95J{Nu{!AG(KbQi<=6BiM;gwi5LH| z^XP9^)fQe@mTRiSP#$)xkxD34o<&=G%SDYpg3YIRbARW(xcSO*jm;ljSpItu(xsUB zm!9Frunn5Z81}=LwhxVCLXT6R`59*xh5*r#W;bY7UA4UWe?g-+fA?=&FUc{etD^B3 ziO~t70|wAO=<9X)Lq6`eow#_Id(boD*$;vkfn!(1Ps$TW6PZk^oC*N=*5cUoWYzq_ z^;a&f`oBo@^!nr2&dl*xAQW|x)6l6%1b`1JZfuMtVkxR#2()w-1Dpon z0`o)3v7IT>rD$R|X&e_fmE5OPNDZNIJS)woXTZeLAEPsXHSCuNfSjAmL8B580M4W3 zFzZNFzGeQ={_*`Xi9}my(^pQ?el%P0#%8>+ZMYBjIFCHKx#dTo!JP}s9cvRbJH&Dl zPyrywWl|M<&)P3tw)p2}uyy&N6;mb=2|$7OHH^3euH%E_hdJSm+Kn2fXbEH7*DSBO zZ^gWV>)HUZ0&Y# zE6+7GPHA^%6FjyW(15MEvpH1Ji~;5*zkG4U&x>=6b-rL^#_{~A*xqzZFcgi4yurx$ zEd7Tf0G#h9h_u;e(3I`%7}^ILS5odURR*T$v4>vxQLvT&^v3?52g1>#V0XtXdX<5x ze$7A|Fy>z2Fx7wM$|d*b7}fb9zH={?rs=u&W-|qlI)es-uZ;5{zVIar$~Hvf3FY=9 zeJ|_P3M10$U7Z65p4)!(uLnAZ-^6`C?Dn_(=$Ut~2N24EW8oW$x=5BGm`D1@wp@}( zd;zZonn&q^mC^R+{z0MFYZL}-#U5b2_!5#9Z`T5NUbUk7>nmysZp8e9bd8-c3vo6c z-7E`$G8T?8?cPKaKm>r~+S@)vE@~{XfhIaOIPN=6FRuJFMP*>-n2;o8T6QO%+|v4| zVRv9BD$P(h<{I|}M?lC4?&oyez(OAEHmp-CbbJC1H3O}m1OYNp=L-x2Gh0OA-ksYk|xM>ZiC022UA zmw;R%(Frr|FzE=v3hj0DCuBQ(m0YG&vjC8>8qi_Vu3B1^_kWm9!O5RQc8Qkg2wZE~SZV#+O0>K(gJ48BBIFT4k|Uhvi3 z?Y~0jo>{BT4Pw<=+Ro=^6r{*GuRJMw!cmo(32+Z`?XO|8CnOR|y{^9Ga|*DxF>|*v z&%6OB|6SbI;%^q^XnsVXf%(Atl-dtKu*2mG4dLXwss=$b}2944(>J3tp{Vi(KCsx(`9LK8#BC*WWpPrFIpRp9vG%YArqD9Sr zz5;;eBq9R%YAHo&FMKQrkRL3$LQH}x{i80hd!-JB5=F;e| z;OKY)(_v-kOcbO7v#qx!gs(cpNyciWRL?|2X;$<9eMj4K&+j<;J76GQc;0c_#ZBL> z%C|J~-h2M4Bgm=cGM!PQ$mbk^Dbaw78cV-YnQvZ()St>A#aVy9NoK3f~9 zMK&n|MtVj({W!Jfvm2T)u}7BRv}t-cpH55l6`BI+PQeMS$9)EBWVJ%B)+y!Mv1nYm zX>a>OBksU(*NA&~VBB|zq|LYElV89rQGNQtdi7J=j<|Fxd9Br`E|m>S-o{3wpcP}7 zHHd3rg#+#OPpzmf_!?`Uv!m79`o>zk!AK`zn`n%JFekv=sf}ky$z~F%2vfOPO4!k7 z3`)RpYd^lS<{r6RqT`2{(3!M<*03Hug_%HSWC_BT;&oTbnPPD|9*Qy}!4e%qt}WqM;!9Yj&u=KXlp;=Va0ICSK~DQKuf_O! zX^sJN%<~#b>{ozrtEHedX*xTb&jFn zFD}hBURRoHTAql}MA(F+f6Uv<2|ts20K#l;EX}=`WED21?jR4qMF)&w7)_8%7gv0{ zI^VLw7m8$`V3fu7pN<*L#96?NEmx`(GBY`aR%IdpoNp%wbQLzMEf$Z*g6uF0W&5CO zC#H(|UL`pnAO!kY>$x(2IJ9>xK7^{p_>r8-5G4 znnaoKXEIuV;9)bW3&CWv1R}8m4JA330`>n&fG_T$r#64+=>(gefzN=X7LB2A0Jsrfj}hfB;Ej1H#XtSs;=E1JDVySj?bNGNDF?S=(G&WLx{j z-p)UVV=-?eiW5%aq2Ii`=hN^#x^Z8qr`%zxsVTHB!}MgkQB#N?igZ7~ciN@c!5L^4 zI6Z-}zwc<QSqADj#{bwB&;6DStTB?v@#%D3Nr$q*Ez5)P0?rSCs!&XX#EXNm)`siep z7`>yd|H&0K1vg8W526_X8}S5t1)7jXO$Qn-1|SjPDf2`bEtLTTIG=#f0Og%j8G%5k z>9{|@{+4K2EhgbV#;#WrlU79l#Xf%f#s%MQ?HN6MVsIRjfaqeI0YPqmZK3t*tFBu1 z&DtXCa*aZ!#unqkQQE8%m2F}IuOEM>rTeulhkG^+y8`>+sS#iU!(j7A;XEmhb;w`c z-Tq^^KGJJf)qXq7r47@px)0>9_>qMV0fU(6utAXwOd!S1pPCJ1WCZX(tUfepl{rE! zX3#1()R)>XKF~S58-(&-LoWXyx;JVHEX_-*@-72={bL0d-FzC}i^WdfP$b2)z>-{S z$T8#!3~y`g-Msl=_Y0%mAUYLC@DhR0m~Oma{)z*gBfVP>_q6lO0~x`nCwNSlG?heQ zLY3GJ^WnON;)%>{+@{p-^fcc6v<$?lC;=_-O&GOG3xJjun4DA;?eo|KK#hzOc&ExV z!;K3xSZdLztX(7S4w5Vqp@0_qb{^}0YF?3L1w~1i_S%s+lSVsHNFtR;Xx!XQB{>_> z#!RGW_Q_0OLg;3}284T@%>|-Jfkj_I*qHw~XWz!%fv|UP`_Mo3bqu}RT<%zZVSVw> z>PqaZ)N-jV!Z4M|%{62o^a`nj(fC_hdR}{{rRSv)PXH(8IKf_4Ru@?6m(>(ponzG2 zSoEq|t6trCVqp9WgD&5Zx*~fb9E&fwbaCa^;t6_ETpq7Wfz43n@rOraF?v>-Kb`td z7xT}k{khMe1s4yG({9idsuVH{Fp?gT0i4GGfOc(k22*{@b5uH<VUg>%>!9WbHaO z@c4xd#a}408Rh}^l}MRpnXK?*^3BTH0!%)-b#Z0hwc&~ALxvDvmMXugq6C?MfOlpU zSan5MYK*x6_!uyi&7f(AKe@X0r;Vld^@UbL13EX6=KBR>#P~16m^}6*aJmCyZ@2Wk z{;vaFFO2&`sPPBkVi*=xIz9maa$`-Qb;T>YPyG48*YSCJK8_C zLn)Jye5-CDe2y`~w=oj}9e}1>CXsfHc)Ck+jMZ>1@?=bYYRx}g;n7suKNH~dKPv7A zlTMjuP%8=n01k3yfS4KhVRZtc5CeVI$fQzjAUV#OZxlhnW5b&dbU$$G#f`rJ3xLun z6?#sT;+1)3Qt2>%bzw#B_dqBqI$K&V_rHv6fEIv7O2^>Ln;8KCnT_43Ex53ucPt(e*#F`OvrFxrNQ;x$E%ru?jJn2}n=! zt>}~rGfp@5hoe3aI&++!o#vk`wE<8%Qht%{bzZX4`pdm2$%uHZHgWO=~{c2Opo97%Tt`2IwSAjXu^qMBh5p zy=~K;jwicE+}KgbrB=w|ORMv*zHCwDe-_#G^YJ?p-1j`W_3#6n@T2E1=nqBOu!Av} zO~q(lQPVhARdT5eK3_fV3yvE#N;6|5O_ArHQTR`S`lmP>C!B$tSq9gn*luXpb7Bya zl=wDk;yMQaKnWXpF>KDg+z&^Q>D@rnI16dg>-1?>)<}Q>FwG)KIwg$8<70n)`|vk_ z>faASe^HOq^Z9&>u6WJ-!q0~y$)cZhhaFAmNdrZvVgoZ_1h|;l_G8|`u3`5Pi$QHh z&5DILa$qr1xIi)qnW!9O{1Tvcec`C*K*#u@H}-YDc(}*;7GWy{G2}UV+2YEtU%sT` zE&#IFh&$kcbMk}G4{d4f{nwV3o+k;LV*ubth0v=H=1?t`JyTh{^r;C@6v;Jf9qvG6 z6b`$bOOcql=BKmM{wclwY1Ci%VHnLRu;}XGE+zzdL_fd>3;;7O2c?O0SyldTmsRKa zU)*`(&W<71TWOU2q@o3&oh(YWbk&;$P-Mey|IXL;wg2{uA8Gy**umeYm;sn^&e2Cr zmQvxyrZU_7TxH)R4Vc0RNHStDaWEiB-cZE#hd1`$4S%9`R%nzm69AM6Y;Fzq00eEX zV_IOvnvmduqgwuQGastx`xMZ-`Mo>oBO+d@z%kv zpK`6Oq*MKfNc*q}1)bLG8Z{YghEn(p8aDM9C&uY}G^SH42$%p@pieP8t=3I`%3Z=IZO$)_!qt%)dXDpd*Py0_)sl01i@LC^EA9_~5G~Ir%pR zc5gn=b_@D3@Kiwvq+p-x0rcoF>o36mg4kVHhQ|m1g5}0ic-{lYh@U~l67fjqu&bpq z-?Wy>qVdzO3tnHdR%HxEVgc-8R9k3k5T3%op6p9cL^X%fOUX zt6r1ReHYtufpFXWq40Q+%>qo>W6P`aF?=R1wi~}wUu?T7!c3{*K_!Fs7F7Ps3J5Zo z29p4WA0-CIkI6u*<`sR!9SAS1aF|MQ>=?ez7m5Y8v~<4+_U$upoWr>$ZS95yrJq|+ zn)7j`LT&*1i&&Qc#UIBz%m_f?AZ^w|$NZsE%9LALdLR4y_O?6F@_^Sz|Gwks-Eb{d zl;#>2p!1K;BKSmbJ_x>LIi{LDCx*7y7TO!AsX${E-u}s6e!*$*!Y}j(aDSlRL@J}G z$~^PReeFY!(Jb(ZX23ZB08IATt`mdzgVsx2v!eQ^3(9gffM$F4neA==-7)BTo}+Vg zrXLeE4+u<3Qx3hFX$58pMG_v+qEX>{vDY4G!P<)#lzkUA%e67Cp+~l+9Z3+#fDReW zg2~dJ%``}71~RFXboPxN`_+rPzIpAcdAAhVjHRu;&cmSjU+Ew7zGKy?b1!Nt{rZ}^ zqEDH%N=KOMJWMHM8LgE}es^>nZd_RYAFVyk-L1W&Pv8^YV5ArBzm3k&5Q$GZ`b|x|KelO4$M?1$>H9Tj<4&UTCmFrFd0e06>gqmc(Q|b0{ zTF5YyCd|YNuoF*BfwjJ&#J=or?;QRv(sf`4<0h@D?8>E8|BazMIJY7!jrIg1ggS|= zcRI%OK2+Uy$%0?Mvb(+f#K73ra)+s5X;t2}__@?HTAKfpOTMw@8nyZG`@8|a+0Dov zQnClLh5i3Od+z}lM}6gw&us5~wX5E%Wy>9R8!*Q7-jYB_a)gBBAMR4gFBdMkaLJ{R zLXsnenuKaPm||lL?%k4QNtV^Sw7c5g%gq11*_qwh)k+qLZ7_Jr#*%h+>i2!#=k-&D z`dC4ydD(u`_yTC&?-;%W)1&|x(j5PIw3Rg>&*uZ20|1Z$fzFZ1Xa2VRxbvnJb-yn* zY09r(R`YX{T3+?`(cb@r2W&r;UjSb^r4&s7tIZv-!9qgwAq*5(dfB3iCze!MZ)Wo4 zV~L!0dUmPqsZ4_D%z~uHKQ|EM5)cO2;CH!9D7<)H*>x>_wiiM8?KiBb`!;~q7c~lr z2{o*rOZWY-!cS-TT`*1B__?(W4@5zeW1RpBZ;Ya*Q_EBSg!Mm|6}WD0$yLwn?D*sQ zKZDa8d=9igo_J?DsOhTp#5A19#k0nzwnb|FurgPh{$=LMNAd^B*1^Y6YZn>S^>?L*sMKiKs&XpOL5B{QUifhKZmYdSX&q{JzU z6-+Cj85*0;U&j$r6nZrRYsQ~LZeaH zetyj9??X-pcJhX=T)Ob}`Xb|JxyS|<$LLfteIh|)J0GU37Hn#NO@Th|lBTk+uWu^* z9BjXcX_v(t-<_*MFP2C|CVinveh;5%9eMQ3%9gL4XQP$TUr}3VY#4V3Mvo2H4@)G% z8RJ6ehV;Wc=*9IS((W zu-=2$1ezWxv<3t?5s1W*0r+bQ4Qp;(QTNu0x}rN16eY$^K>WlKPV-QlwkDEu0>NbH zZXIwO5{m>RP3IOGI)@=Wo#%ZzpFu9BfW$f*^Q338AbN83xX?;E;Ao%Pc^_{Hk z*c+VfJK*jo#eN?j7@8(aYw~XbQ{Yxs_|KaH=O_ShFJ>@?%O5`c_wC1TKX7vNMWo6= z<5jn;s(a|lB~=fB<|&1D9mtBLwot$NhUK;Ycm1;3&1S7)VJI49QbsdqCBd_Gd6bg` zrQgzTJAhSm=r|;Z>04XP#0m)d!+GiX0u}|JDluy+bV{kY-{$U?a6?UI3;BU;ok{sKPJzz6#GLs7*`eCx zcQ9EA)`9ej#g+eMRLfQn>G5jkUjze^XD&;UB+n?@Vr)90fHVNb``$(KO1~}^3UQG+|p z@tttr!mAsKF2e$%1Wji+?NYIQKAFgo@|%ILTRa1mOxqT$A3=h*Bn2(KLN(fy!YgpHc(Ur#2hVS5atGmHI+4uge#93O)p| z($hKb=u91*K;pfg7Ocv1vH3b&}TeH94I`}$<2eX}dM7Bn!v;RgAQ=5&^IW&Ie zKKXtHCQ1QJs?w@kvc9S8=K@d~#QFB&=R5##&Os(r2sZK~00a+VA`oi(IF;0rNxDz- z;>vWE-I>b^jRvFuLy8`-{iDDn)Tp_Vo@Jh`K7#{}n89CgN@|`32zXp%H(pm=njv+oIh+&{zKC#HE;nc0IgJyY)IP$Y)46t4kB zcRzeZPMpsYJohgi)+J8GjjH7mniL2^*c&ca##jcmw4V6wv_Ng~Pd1PG8W4qtQkt{e#E)?8hWRA+ryx^T%yS#(bhe2o%W-Kc-|k zSbEmRsJvGIlmwqN0{(>COlA!6F{(?;Z zL^8D)Yd}`l7u~aFPVrB1pbGIR4-cO67mgYY7CXJT%6iEq^UJ=C)nI8)Gf%s4+BC}( zp1Ca#2+#qLpcAlvP=KVE;(tGb2@q-XVisVK;bfc6i8sxEprJ*zg-rSFTd25`LsBxK zL@YurPtbc$jO=`LYs+u`{PxlRe)z2;-`;a#c=L%7XX~NviCviPJm&O|0;`}mAL@Co zcfxZ5Y-GXHJKBFUX!rC0<00N{8F=NTy(b@&gT~&{-1p*RTU-9uAB?!MT-g(dxVhsZ zGY~W2KxWwR6wlM2tZmR#*A*HUZ`yU@5AhfkkTHouxt|f|<|m=S5fO4c+K-Ls;u5Sf64_!MUfp3?w;8p^6uNmtYset$)M(JK<6ARq1iObx=< z5_E=~W^4S6&=-ZZ0)!y>BlF7gS`$-3PZW_EZkx4jKAj&S>y2^t#uD>BkqWSTm~SjOv5MUw6^GlAqTV8Lvjok90Gw5J{%ptsu3a$W#O%xhU8O0NY9o zzbRlV&=}K~V%UWgG)5fu9poq^iKYM|1Ci85SQgBb@sddd;G%RWkaRLBJ@xzaJ%Ok9 zs`IzT-QoDI^-X2h{Qix@-=Fk`hdqI?t+6cc!V;6FR=3(Y^=oylC#PwMwb=Xy3%604mEtXjVP3t@Z13O3ZUX;7xzneE8o@8ildY zpsFadXcyEMnUIQZgU~+;CW7PIWi|HztCAh-x4kvD)QsuYlW!jG`Dtx| zab8`aVaY4|PX4!EDbtwLaxpN0T`m2#Ctls(^&bzuvj6HA_MZ6PXgm=}0WN!Qa9mqs zsd?26E9$-jK%`0}sPwa7g_GiId9K}8hT|_iQa!_2N@TJFzQ2ItGd6ZRJT^QR(T1k7 z2Y~V1Nqh=(1kNY`U=qgZd?URVi3H-ReErXs)fW5%fS?#XyHqxn=XZ_C2(8hne1Do} zjAzh!D)~DmwBVpl0V$Aq!1krH!-u@eHD=*abVdamMP%8cL>6FVnG5_Zxfz|FMADlL z^!4%!Y6~#CEn1$Zs|UM$FcwdQ0I=+MFr!LV$k${bpkn}_Y5H@GYvcu3uW6zY(VfCyN-_>tsO?!?H4oNCoF3 zr)XY!G_Uno63??KKfgmzR>mN|@-QocK=8hw0vcYp5h|I7bk#Z`rb~}|BD&p*Tq@^GT zYLiA@;Pi(_Q-VrmIuyBII3~f-ew@pPj0NpnzLN@nmM|1t$T-g=Vi8^!^TyxNsYX%h zkRz2N{D|Q-cnfb?RsRE^)ZfHb;g~51APIk_0&$v(z_}aP=gT}}5IPt7KJ}btB`6}Hx%Et`B2YaL;`_eU1Q1Z`%jL(GGO!Cmem$sr;v(Fqb^_n zr3=cxg&Okxy@BUNaB;eP+N&vQ`J6X-?yrv=pwMym%Q83_h9?5qxs^d zvRe=LjK6cBYjoGjy22~pInwj+j<$hkKC`y*-USub8+Uh%JpZk0mOg)c(EeV>(Bw1Q zjtxG1-SXQ1Y9E?>|M-Ao&xQqMcQ3CixEqg#<{0`=Mx4Gr>|`XDh}7Aoz1i7(DOo0y z9h#VXOC^PqFSt?w%4A#ebR$<%z-4rjDUF|?IACFDK64N0j6CE_GXa$e;Fa>y1r@)M zhz8VcgN}zdBKt}937k;?I63M(%}zz(UU=~TzF~g(LqrP6$z&&9HULf%G?8| zN!Fo6unn_QslRlpfi}r&W`{ywTVz<-w%4)C8;p8jA!{l2n4F`E7mCD1nK;xnzI#Xe z&?{g=x5BXk2DQBW-!?S;+MtqKaM6lL0ns_?Y~I~5{AVILq8pt~QjAHXumH%FmY6hk zbw!4yVCpQ<$fe3;O#lj2a$XqCbBLld3xNtu6(s}{Px}ux5A0K#ZU1RBI*EAI0 zva@aY$<7hy!RwaQKF~LD;Nbqwk*C)-7Tun-7CjN|UW;QOru z&z=~b+;-Wb%5Q?Xb}2>y(juQ3i9x3%a)n4N5f6l7L4PRfM*o3GD3qDC@)AZHCm#+4 zX3G106YisdNNf_!v;a;zhIdmO{ZZ1I|i45eGOWfY1RWXlN?SyR;I3pt``Y2<&DdhOhYZ4;UbTU6)z3bKq2j ztf`RQ(3k+*ofw+*^)0N-F9kvK+dRS1LZiA?DHE4A_f5RfJK?@(Sxv!Zpw6FZ>7CdI zEZ}v?cSc(4|e|&zBu})$Z zjcCsUz?pr~XeVpsG6R>=n-o5Rr}Z=00KwBajMfM3gek5}(h5rs7+aM6K4&g4WRY#r z3%0y)QKfa`pu>A&UYTWW(%vUinjgL&2kQJD0Mppws(hTU_XVX?Y=C2s3^irxB~o^d zh+qy+W3hQ{L$PVCHxL;GZESb?LIab&aCe{0vwy_l>u?9cLm;GEx3=`Z4{u9dk!i!~ zhN4?4thx(eK}#uil2OuJricQ)subO9u%NAAW+*6{o)U8eR?;C9l6Yzo__=#Qg=Jl# zK|KeU+Ee>FN1wTQRsDTUWtNNHKHB@2?_Ia-v3aF=8xMAmZ@OfD*-r!y$Inyx0vZ4esC;)^L@beY;oiG3wyA8gPUdFQgqa5SmekK8U zg}zXfz&GJafdiUHGIUY`Yfu5MYE)8DVZKq_RAN$JVAd!aWfD@-SZcn`sFBz2IWh7> z0H2q6Ktr7efLXjSQRQ^LkjA3SWsHc*YC@l~`B@-f(oT~h9~y^*2E%cWFBEYC9Tb9n zo~KjE%$$(Y{Lw({t}z9-u28=^PopTu@EONndBX{WprzMpX_NTS&gXWlsm3$WkC z@4>k+00Nq+061y^(EcU_G>o15Lop`+&fcyO=PuC9dqJprP7FI9hxf}CopMQ2dEOOG zW#)?t^y;bvos5pelC8Z36&C#xU?A3bk|7B)!?MEha5U}!CLyzXL*saF%vwb)0DuI9 z`FRlRyO&hwUj+;P>E;33o(t!deBnUX*wY72j=g$uQ|av`X6?fFj}JWw8hOq7rqX*K zefQY*4~`H1Y2$*5?*Th__|3z;f4Xc@#l0Xn>wUp!7nlpb5rSQf0KlK*%RMg~Q{FP- zJPN{(Y{AV6b(lz3>QQi?hB@b}MlLpq;K9Y?6y`Prb7*988b>#o1rS2k3=qKmz&8oZ zOEBsRymq*ITnhj&4@|J@D=fMT^YyB_D;HO8YVNiDsb#?SAOKc3F~g9W^8j$F%$9%Q zh2bwxAUuhbGJ7&C&C+p>n+utdS_FM!Wb!aZ5Uo08IgZSV#^d25Jri%Y4>?{2UYK8! zr(L+P+;UlIo@S8%zJrc8iWP7UUvM~|Nh>c-P;}Z-AW|d2NwG*E!|#OQ{5Unwmcyp# zIvOIRFbP*lhaia|O@@6$VpPVhl8Oa}hGOFtjU}clP(#|if!?lB*AB3$-|HRs90TgT z`@LfW1q;e8*IvH3@?HR1Ba`A9OAug}-v|Jpj3jL&Azv~;m0l@95_uGaZUD;50>(ZM18#nDb@tw8- z$I)_&ZXwv&4FDW30dRb6!~F7ZfSGgvZ{2mvYJNh4>IM3*=1P~d%YX6u5xfTMo;Fta zJuI!y5Ncm2HkNcMA^=G9weSX3&`wM{vUO@SdYWh|nFShL_uwD^(zv}nxbxV6eNJtG z{w82*x4^Z3rPQLk>`>R}1Ks1U=itQ;^$E~9?(fKZU@I9cApsDf(=M3t@;{t zjP*>o+MeCf@cO%EhEC9JLz72vZG*|6K`n<4DhvhU@ezpdnt@cv^h#NNMZSL7 zf(q-+sQuym=fF0Ru2JVZa1Z2lg{BK)Y?K1P2#EkjA%@}ecUhXubW#E#k5^iC7sGx< zaC|>3>{Y;U5=Z-NZv!YzI=rC)U;uXjn=t^uJX}{~+)!**&)d;9^jElVkGRLF25M1gBeG&$(Ivpy3n2Xk-ipp5i6i@C!kNpjmge z4?W*D=y(}4*y;kEG9Nz25nD_WidrGD-nyp#x0fxd{8h10a{+wC-ZkcW@*f|xe|BHz z*b5k=7ZO?JrUb9Zg-Rz3B_jeP@zUPTzkqP;K;Z|i7X#Y-df&MFFrFuBI?TcY>gtch z=`fKL0P^i4y-z;;){!rPu=e9Iec_0=-{$GUTz|$B!2m&Wct*qfHwaXX2zM#^2O*j@yo)1zT+&&T~mR1*Bjw#aYf=+3?KAUF`_BViidT`%brK}jv zEf0wY07TpV&e3P*l$h7R-z`A@pM(2T50tp(gSNp(;mV^IR2SR=TKmnN9mCIF+*I}@ z0D}7!QjrBsDA4#!#3D}7?2wVn1RyS9hr6e~aLfw;J;H+2l<7SPWO+KJ8_v~FvlbPg zi;_6A6?`-c0AcnW@CKuYfgOGGmHk~epB!~wiboJ8e%~kpOud>2_&XyIQQ3mki zAOHBY?-R6FFi)#k1h!cdlSWErG60~@#IVEHjU&cEs}1&yd)|~w#6|fARSmyeEQXj$ z&6*~l**BM(wTmO55`hsM0(Pp}|R5G!0aMIiRr?;E$F{tH* za88v-eP!Y#i|5*y;op+OO_-EuBV3y{K~Wiu7@h7QC=$@{>i`hQVW;m1ot%#-0B{O` zZMz0Qr+ZGZ=`yiUC8w&}bO1U$!ErDlo`t_TSergW zlVY(~kwI+)jr&;{lS@Dot%Hs&09384aK_KHHr)}8VylPTMOH)toIZb*NH!*POp+x00^{qjyj(QdK<1T(615-1;S)6fE;cg77#FW zRA$ju*B2XCfVN8%n>7u~>k6+2s$Lz9r|o+H2c~T~mw;k5sETR}42yv>E8|Svyhs86 zMvKgvdV@-8#k_*;#|K|UVK=GeW|R(WZAG(1HVKNJ5)w=qzRaj`0D%(II-u`$gAQ*C zP+EI18ut|$)eA{_pl4ZlMDb*lY38${P*9tx7~^( zuu-#Mg9|Rz7M+Wzr599KZvOnm^Il(6W&PTb-ib$_+tu-nSRxS;vD?x_=JXlHYlNXb z0Y(v+)L~O)zG1OiF0~>hMyDK|k;2QbT~F4@V_WhB`x#Q`Yc8n1r#w&7g!_ZP#g6n$ zypOXD&|w&e#Jumf4!#-;$9)1a%|1vnch_Hx450b2ytd%FFJId92H5}C!QaCGpdoZy zOnCe~B%C~G_I#FBGxjXl{J+sFWqAMsmjJ7I5`CJtuCD)cp;5IY7>z}AN@<}^AuU7( zmgUtY{c>yofhrEqcc68^{*%`Zc3(N>^kWE9aW0ww=OO?wD15kQ;*SZ6E9OZG7A`>0 z4h{f;an_*}f*>x%NyZc~g7)Fb{a`!0$YhNH-9O>!gll#YY`ZTu`oWgf zk|1Oe=hl|~x0O;!!Cf2XKfi8n$^QVrtjC0yu2I)61P`4`iiJaRZaoY;ynB1bTzl6x zmV6nQ&~Qti{T*NnORrg4^Ap&=0?Y%(4B=PdCuoX-ZC!X@;2Hwkj`cqR=0=1mwa#kK z#nnWB26eHve+mHb^J0^R3tJK+lRhKRf5yx~5ZExk{NI6*d=t)F@e$hIQFeXB;97eD znA_Rwpw9!qS$YAbeFv!hW(lWd(&fImwm7E}#RCln5a4q=AooL0z2A0gbD!-Eh7GU< zJB*J3G%wZ~)a2{eeg4A6O=Wr7Wt$K8JP5}+fbFulZSk#B%8cD(u9n}uap*2s@DBi$ z-X4y}JlvS?bk!Q2HRv+4JCKlVq#=`ti6Mul>p<7o`zXl33`iBQ3XFK*gOW={`p>Mc z|4*$#QV@^Rn7a^s?LgQ6^^Ln*(KK-SLzB!96IR$zXw)*P8qV?1LvI|q9qjEbmoBLI ze_*PtDK%@?+T6im%q+~)D62&Rfq{#aWA71QK+hKFRW+9{s{ARKAC<^dB5a71-(!)P zvk3PESc&(sZLQx0)xRAW)Jn|R*x5exv`8Sxoc_b{X#hBXFgn4D`7>q#vIY<;sad0_ zuP-v)vAUt?Czvga-w(xNVR-I+m&`A}@4~qyzXT9Khu}xm=Rd&$0p~1?5a(cm(7EUX zNcjW7?i#Gl*WVx!3uRof4d&mq4^6%fw&`$=hr*2+!w}RcP}O(+p_sSOpl(t~Me+p2 zm8Ftwg%~NWF3>N{)5t4f+r4A%K)*^R)+(f84Laihe5BUG z<#BG1Cs%;N4>yyUEx}NL#$AEI{avG5RIp#zw+a}_?*Vw`7}RpT-4mR6{b2W>fUT&^ zT7?DMlOfqb)&ORV1kSz6tWjcmtK!|3{^#E~)brq+64NTs_!^30dKw7fXWib;ktf=R z9GigU1S%~0RVIzR!l+S{DD>bjrN80ml~D&$fA`rVZtJx+NgU5de=0BqJ2heBx#-9qyfY z9T*Dc0eIo2Cg6OO^UCsWE4OGLSOtO)_x=_v`9@QQDFgs;e`Vjv{{nCn!*HdG z+#T50KjCgRYn5{hD!G+klb@^-11+kM8q4#vi{P`w$r0Bf5LziLSYslo)ky4uGpEFS zO^I2voN+AD{MmxM6+-e?Ow#l~&3}B*v1e;@|9!w9I#;s6I`@&9sqKquF&BP9gQVu0cedioMRpqc7Ermb1N(y2f=F;GmU2#oojs^!;@R3 z5}~=!sBR?abY~x2sHjO%(Df>rrO=>ifQ2X*2uKOZg%y(?esQW-0GT;lG`Zk;(Tc30 znpl^QLhTPn`>XQxYt(Y75uI;!MTSdIlb7Xb=7F|+alr09Ft^NnrASB$fi(=Fh6U}c zM5+(;JeH?ZS{GGW){6x~Jy*VrfCkiBpixQ-0BGKV-|g-|cme?HMob#wBAWnes~g(ko?!B^K@K+5+P(&Om6?=?gcregWz{0DSTRAQcrDbNTm2V-y8iXB7|u zG8rEintCTZTX-I0dInn#7o@Lu%)QkI+O5Q_UJ76!!Nr&o;BWYmU2-fTY@RLf!0u?$0xr|8>PyhgrQUGx**a;A)YQA_L z06tLwz{nARz#f-BVkGw~1rp=ME~ z^>#4LY7@N9OW2Z?-&YZ@55UR<`;^0VpM-ljiJ?T+bRo|Jz$Y63H~|*Gf^8mhcw4k8 zSq%yUCcJ=v)K7Q|(QBSS)Mix6N@zgJA0L9%AG` zAmFk%nKo$A;{%TO-aOp%W1A=V!P4sdJ1?GB`r`tGyuR6WX%HlJOF%h0f3|OB+%R5?oro!kyt!#P|0d5 ztor$&`L4ot+MZyf7c`Xr6hOe31krfH);;EW*WnEff$d)f)Z3WK2+XPOc}#$u#^%UM zC8pV)1{STdwibkZVTI+ox+3Fx(A>2aovIRqEYaL&+f-9v*a-Hn4uPR-%=IdsMN^sO z3Sd2bz#3jEFsK)mTeORJwU0auH25Ew&4^7u!K_%}4aYp4Ba5 zHFv==#?i4^mZw=-U{GCYP|KHrLf8rH$9oDh@KXx_=kj#m>0X%4hSOd|pb1tqmFIn- zworeSMlO?sz;uHq`XgxB7sJu`5GRw<+yXQin7(=nsi=BcO~JQ7=x&7-F3!AXB=^6W zWIgAUV9aE6_(DU?VDAELbt)ucQGroa3tH@AwM?RN`XjEtZf&`CRej-Is~d_xH{$dS zKeqMQ^%99N{?&~Owu8CS_0$J#*Uc?8-*)4Qx?f>HP+^tP*=Ka3%ysO8nuNfA5KrzXHH*x_W8VZ!sfqNBi&} z?e1V30F#Fe`O*LY#uBsUqNXzQT_&~MvZr(8_lJ8Xe!xaI!sj{woNjsjBmw{@ykeI6 zDYQyyQ+2-Ks_J~*MvG2a6^bQXVE;aYU0z`E93OT1?X%dY9JJ2=cj_dQTsY28!M0xZZp*;qU?RMJ$3>0LVBW#g zJKFCVuz8-oYDv{!Fm?G)?=;_psm^z-YkXBD6{|sG$6NYrPaWxX1%7D-gOs--Kry3Xw&pSb$l7BwPQ?^hjVYn$8k@ZcZV5x8sBM zp@$ZhTW+o?G^_%X!U^Vw1tT9Ph9|f0J2~=ar!Rb1DiZ2}QCtEv|4VRO>GsxvpXX_n z4NI!>?*cp$MtSFl!)1Vl4R3Ak|1oIzLu=<0{}9eg@Lub{eE?J%I4^(|YJ$it4^9AU zTY2T;%4ZSmUfOr^vQRXR1w_GfJwk9E06wIN!?6K;1BJ8#ZEdP6G+YjJ^h$|XDDj7) zL$E0O!E_kK9s*>tD=jKJ5!#u|xILjj2KFi_9g)GRS1tlND&jXI%FyrR%=QJ-m6+{( zi`o}hN&leT_kqI~JUrnF9CdhuU9e`|a16`UORFC#x9CH7eV ztg0?Bd}euV!QHT3V>0qVC1dQIvyRoa%*0i;!Vo}#!tTa+%}f#!oo?raYX?J-eG~4z zWftB1{t3^qqkR+qSU3pzf zF93R4j=k^Y5|IKHHrU5>9H--A{eC#k)Xlp=5bOXR^Q!Xo8@a5*nY{gE4irGGj~b0; z`Vu4pp=ivFt^*M>LqH^iMXvV+BmE;z|9;TkeFX;PviarKjUWJzfKBZMjrPq6PjKSz z+mGLXwKQM6c-|IR=-NlNwp`IzY`Sve!isNg+H>MJZG(>I8%xYPEYPbfE3Dcz zYK7E-e!m2jZtKl5AtFIhY5ypl99wR41-suk)csvJ&$?9&MgI=;|L+G*j{Rgox#c^H ztF1r4G3jp~?fnLrK2NahDGDf^Kd;R41A9m~0G7$5@TR6%&P5*BAd57T(=VwE?RE;|Yo< z>|{=0z`x=`k0uh~?2xaC8i`s~Px+GPMvbFf1Y zE?}U*6GwZ;U%q%=*;nwM?&=tRWOv8#_by*l`8d$%tGBlFJ$8J+@zTFt()1Dlmv8^c z(I=YwZGTH7sBXDbR5riNatCPt4dH0ai}ma$N1fYzp{O00LcK;IsRr}t;(6ufD*)tT zJKKhzz?uehn8N8#f;m#zRBpMwq1bqhLLye7^Dq>N1ztPQ{qrT&`PY}{X&c8q!2z>I zQHB{0W3E6Ou$W#Dx{z5TuPild79oX-GTn@MJ^oV*Iyp}fJ^2*ZOOZ&XNCUGt2jS{BOnB{J z&J-h)5D-jZ)cBY?u%or#_Dgpla)ezEr?sRwS;DL&9R4sipZ8JiqJ&0k++^n4R3q)F~tg z3|%RKbyOv^lmQm*2rSB>a5O%FZxFnf;r%pfX;?%TfE|5hiAl2>ScBN^4V|=kgBX`D zTUJwmqr5t>g*G-VomXnPwryzgb@cXwmcC@e{IYL>J^dN5xqk<2;F-OhBljKZ8UGV# z{cAv&ZUoTyy3G@8>$iIjMPrG$N-j3yB%?$^AjT#laIyh7FGGEy@ge|@D`aA!6np(2 z>6zG+Z%{Sm>lAeW1i>g{GLfPZle!W>UF?@a67{Iirn&aP$#JzQmCBFrYcW?WUW8c>1{{KX;{kq2DAIvMuyCIoy zLQir3VGY0C6Buaev%e0D%@1~m$f%NAbSf!W6A~*d_$pY)DpEjVYd+_sFFXLW`^b>P zy94OzQPBQaE}Mrv`e4yJ$}PIJpxr(L-><>m_B2HVL?Tj!UU#sIp9dR!-%TrPe{ryT z{B_VilR)(^gztx%aYXo#eG{A~Mn2@gE-t*dsqAM!t>+>*ft}tC;IVr_h4m&lFCD*c z-@)#&7kftCuaA2I#{tVE8<`n;`sLW{Q^Et!j4$|*fr+* z;Qix+--JE(0?Tl-&P@*3WkkACP$U%#3oocH_(e&cW<8$sfs>=Z1oP$rHZl-BT?za%CY8L@qF2thXq5}+l$dT^RB5>r1U?2}umd#s zOKg$O1W@9?_1oOw!XJflg#}(%alM=KkB^-tj+F zS@kOyRa);_TxGrYl25JyyM9ZcTylDmYdRQ12K}e6P*pKiMCHpk-)X9_+*+EaS%G&KvmOOPQWWEL zSHjFd07fISH~2T-s8P%xad_XS)3iRo_y53owI1o6_<=z!YtSmB1y;RkP3MTy0^5(B zP5?O9UgsIWDPCr+0)@GJ+#<|s%242r=_SX*CWyasIfby!3LY+%!#j^Y0SmePlIG1#Rhp#Hb6 znNxB8Ruqda}s#^~G5o5kT2$PwMaxfKmYyuAV!hV2Y{ygpv$9$Oo z-%xD49KOE>BPLwi(`(0G#~uB`Ku<9&v}DqZH*{8o->O#bm4!C0>^ z92xQiA|MaJcKkOOiH*UwK6Z(#;C|_Vl2?J2Ur}z=T>-#Q90*69U8C+z?Zb|jag-Q) zC1%f{8^oIxZDp{#P zDJx zZtk0S-UD_!mj&*y5bXZr1NN8T8az0lQl*gO1A=H|5|I+#%rH>3OkB!z6^_L1Hc#*v zXyyHOPhkIu(|-u;T?fxpQv)lQUsGtf4pW0MXaB_Td6M!rTpSjH&#K}fmZJtnjkx@N=ZmH=yg;cEPdL~Y>z3^Tlc*1e8;AqI3*a*%UpO|g zwWa@dFhyF}2txck0DMdVz=!|vmSN?Z1gI~V z6&3)S#&V19!aR+9p-L__2!$l&4My!lcF*R{QP=AZ00z*ATrraz=zBq3q49=!rRFcm zWny{1&GX)o?(yF^e4!)k{-bcOE!Qop*<6;VU5Meeo(a!kPar%B06GO2b}yIVRVjF;`*$APVw3jjhlf?b#3-@$x?ssU{Mbs!){%sGft^wbu*S^Wc& zeHN1K!F|D)-R=#Zln8|iu;Z)Y{;FcUE=63YVOS$AJ3EH&R7ga!a*KAAlrh^79R-yp zt^7LdDUXD8TYw-RbA10I06itiK4gK9gOsCY3}*qKAXr-(kC1r8bZKFvMzL~FnO^%J9$Z_h0;Ur}3V*od8d84rGT zLDe*Z&vFUg2=?T^SPnhu4fOzq*$(BH~D z4K=flE2RAb0E=sYmHY$a;@C}CC6^dcLk7b!H(b|HkwHC|tH;k4av^J@GtEONddeb8 zfkoCVM*ed}EzQhZKp}_2fLYQ7+E-@Q$V+1>Qz1*(r!WY5ssoWHz+4J4m@@t`r~jBI z7#T+YfI%&+Ie{K>Sj^Os-ib{htS3Pr=~eZ`KZOUr0@*?a;L*u(SI>m&Rgxf) z0f@1&2P~2ju;KL}-1XRSLtH5^!u}ip2+go?c8^Z_-UVQ2ML+;S>W25W11HCRS8P;Y zP+`?wb@9B?$0mK@^_qp(98rP1jukK5uR`aj%(ynE7<5o@R!BSQ}F-cgso8M{F#WfCiXo*YY-Hea~8 z5jZlgYs|eBg#T&QEW;|o81X57eIgkEs7>bKk2?JyiUIh-k!0Gg0G)s;La&s`fli7> zoW8P4no6GsO;d+*wClw1gC2im-=Zq(m*FtjdP|(ISFYfu3UdI0-t3NH$Ggpa6Mw;0 z1)!n)(O5jdHmP8=4s4?a#!+C^DVvH-+GR$KY%$iv0~qx8PPjJ>*gRYP;aES;ogUXE-^6)Yk(Zy za4(o4B{c>5jo5E68QP<>Y<6J<2JYdkUJPX35#Wb zNG7kCP>3rm+N(j!Ed}Au11-N9?E9zS`VYeWK+Q#irpF!yzo;)VUW>;$(mVblLRWo} z;aZBO$y0F~tbD{);5d0WUyognn94_B1L3~o1NIlAi9}#dvFX}8ouY}NGBq)dItPZ~ z1Ym4F(lhZV*w=VdS>6}QE!vGzkuaY~cmB>4`kYR~sV2p#1fLHO$Sg3w03#f5KaYlE zahFLgt5eG*rQASL#>|0x?+S$bceD?G4H&{P7649re}MA>7GU@m-#S#y1L zzWzsgm8>ohiB5J5JD>9eA_D*prlmFc-yxZ1AXqXhB6`ML+dpU<`YNl*eV5KJf4$JC zS{6%W<^!PM0}b{83-}u>4h39GjaVd9ftHfV#Uk|hOW+#auvi=;PXGHo6Yk9}Ul=FN zxZ!?Ti%gme=ari8GHc}xc2BUSd))mjM#$z@SndOmDgg6f;osRYa*sC{d4)(%jyewjpH=`cX%tMnAMAHyzE1h8%6$Eu*v1NM%H3+2q);jr zYJdW}K+8X0VbNVxY1M5&pMXRxWU|$EwhiA4=XWemt5|XAg7VF9d=;ZDc@03Al;8vv z+|fStKf?~+8+1Axh&Nt>op-^0FTt|p>H_`s3W>-Hf_`Mc?tL5IZ277P7W0x7bw$4` zFen>vpZ;*vcYM(C(zq*dtk9rdI;X^R12*_cP_uuYOldC7OJ3p{cCtW#S%M(cahX^w z0rSX-NlaiW`Y!t%PU}EVg+xr0c@Bu0I>#X--!5@}ZO5D4JD8~_vJskx=5o67Tat1yfxU}yg2@-@s> z!_VvhO#cO+E8H^=0sxvpz??Jy##dvCaB|8sHO0JO+LOUwz}^}NL}C-b@RT@61WYOs z0RH5l!}sFQr0;P6f`k8zAAl?K=C4x#M2z$lg9&#T{5mH=C1mjLSTs)UA948(Bog#w z&e-aC064n>PqNqiCzTBd_vdE}f$sgFsg_S_#MBp!Ru}Gjy$~W^2 zu|Hm7SI5Y=M;zX*S1qY}8?L|Ifk@odIqH0F!WGzCXjHGP zuxM|TOT`AR`jE~NlqC34F#y{x0D^JY)?!x4(dU8Lmm!BQ^bV|(SAiL9iN+FKY4Isb zgh?`UJ!8RAS)T6euztP^pqWpyouBZG05GX=B;GON@;^4_^#6?=SR?#rfag2_oCW}3 z+I)lHEUdIVRFkj&D%jA!0Q-Lfm;;MbbN#Xqp5%M>*q^Zs*Xa)pym`3yN>tdFEv$If zsF5#CH3{LpFe1=4=y>H&&-jnvS38_5P*Z6Q9CH=e(QC|F#WEbo0hGQI{iJGRT z9vl`=1e0n6Oacu3Aq4#tACj4iOOTu_4B9K<#jeHpd5ouN$t=1)-LdE_1fZuA_9@%s zjtU4!Hsj9|YylJK515DrY~ZtH7R`06xs{sg#CJb3z8C;B93lgzj2Ej1u~$GcSA!ya zp;#NNmlwxefoFjsbj)ULbL*L6CK{{14r}T6T!y0{NfCI%Vv_09-rR zm6SLS0A~&Wa#Ag9(qYypSFda++KR;{F|hOV4XP!vIF-@LYiggrsn-KS7{%H?#BEltq^ zGDm|!k~}qiC#Gms`kw*`j{T$yaOfQSo`t~AR_Lc=3|YMdI1tB4&;vHlE8XMnr@{6v zsVg#kStS=&ry@2PEP_t04{s?COE;%aM)N-C^JMMm}Yb4pEL1ppvV+moSZ`j!3= z+vXPXQ1HaK|)tZye9k)Y25z`qCpXxB+aBIAm> zf}I#G+R-+21!&hXKFZ?5H>nk?*3K#35r{;w3(qmNTwJb^OUr0ptKaFn{7(IxByu!> zoQ5^cWE1hW$M9G->QX!tB?r|H~#%hu`~7~nI- zcPJ9~!0nWR0LyX-e)e~h&y39+%>oPVxxhZhM_v9WMx6e?g1ON<9V3`qYTjhgDsDty zP5Y4Je{J62qZ);@rpl`SZ(xZ327okCov;5Tn0t3%RwkM;V8VQF+#PtBNaiENJ_-Q% zM5O}by@7{tu}UVXN3mN_VZr+FdjJG_lV%{90JN7hmKc8(2uFr?o*4P2FBm-`mx^lE z&nx>oJQO9(E`*e+pBiUPrV3P2Y9JYL%CcEmfMD%pilB3j1x#c;NY-g2r4n>X!%hbt z1iB&*(xntu=&@=*TCF&_(D!*NW@gX0GR^xv`tLs6!uIlPx8K#y;JUZjL(H) z%7>W_#}rTK>8y*Q`R7Wdik*`MNOZaYDbD^K*rK)EqPs6or@Rqp{nKDpJ_07=P}bw1 zo&N9+D*ylvMy<5!ziiPfS7;T|d2D4kvd{o1uxASls+&m`pujY^3IJde{5U~;L@CLF zb3w3CBg#ZV@w_r~L8)1zDFT^eWkPOskl9f`FTS>5?kzlM1PL5y7;< zrwOG*yx13x_UvdM`8)_emd}nTr4j*X4Jk!YY@K;}x$!A0&DOrtyv57)&!96xSII3X z-gaEsJU2#*{~c~haHDTHOKO+b6uh96N$R)^GcrRnf*uyI zT8}1qw%-&d`V=iq^EM>uEOkpxV^U=NmHto;yBrFfNbB2K(0ekM<1U-ylPO`GQcX+~ zsU+Ye7LZdIL%PhDOi?VF&S5j~SRKtW5sIb>epwO8f>iqRY~Dkr^9*=NPTXZtB*y|i zgvLa54$n0hjSqlEf63tuz3fTm5`=;BUtXT4{gzxTEDgsKPSEb##$5p%S~4aP3r7Js zep_r(-^-OHgDK!X+H3oYKODufWGr1hWmA%K+6N$Hi@HC|A@QM?HcOcRVk3C}6 zD3;U~8GfvmNou(8A4%r2_;Wh|30`{aDQP;%mr8QVpQoetGk@^mV}JCiY^Yg$Co{>9 z&ha;bpr@D@^pwxDg`S=!!jL zh4!Pi$F`BNI2C}ki}C&ttiOOor@9=J*rQmW$$dW>OE{1A*}f8t#Bi45tSS@FX&(U6 zBLO=adbTg5@@lzcF*m|$!tHPA9ChL>Jy6~v5)idPtCar0td?JrOh={Dz{3IoQzuT6 z0*h90DZazWQQ_E4wh)&99)pV@@Iy`llHlnYp1sfhiKdeoaWtK&X*s7JnZsEoptG%A z{{A?BLl!Uim!CO3Q;(0?`x1EPPEA3BshKkz)lb>-GYNf;=mACNVi_|CK0Qt7kgxTp zi(mc|W+|0iYbr21R~gi@Rpk~P6^g`qFoFPU(F=?+h@oG(M4S(6cqMErrOz_;FwSni_b3fnWt44upvi+wa>M3Y2D%~>+iu7aAMl7Od>3nh(s!` zDJO@L90u^gAjUTA0LEZpE8?b5Ng~5xMP_)pvIUwX`P-x&WQiO}-`r_X)2Vlww;er0 zmfmS_luq^b<r^kLRIC>Z1(u{kixCj1 zS|+XpeO<{tfH;DQAX977xok>S3NZ_iAhQR0k~z3I&Hpjg@H6Ks%d+d~9D+yYG6{H5 z0?y-oCYq^FTOF8%RMdb?z(?r_Ylp5tjaRN$b z3O3CXNFFoDbPACf!cOzFafS(ys!h%1XybuImQd5Vgo-DC>2})W8PfYR2q!f?Sj;5c z(}7BMP5?a*}8p`plW}iC{Q7;19=!oc{36Xgq;~NxiHIKz&pIa8|>B zGKq*u=`GN!i0*M0@gY)PxpCf@1f*tv7R;#P{uTB3;lclO>Yb1KJT>whxi0c!bgwuk zAJ>HlH9mHK_OZXuS`a?1slZ(47H+_X;0!(Bj{^V@pHKk!DBMlt$LxH#M8p`8cKm&$ zE(_5)^e|)W`_m+B=U<;3u%b`1Tj5g$0K~`f=AD0?Un^(Ud_Hse3;&XHX8}9#uvSU@Pmc&;^tdO|pjJjz5OqTHfo+HrF)9EqNDSNAOUf!&UI<0su~U^(q;m zkR|WCSt}>B3hA`g07cUo-g>T216P$P6ARDkHQ>6z!K(CG;w~Re7?4Pgb=E7Ta*0SJ zg@-^#gqhj^Ug6l; zK zgLT#>6^X`u;Ya|pa{(CCzyRipMdTX7M?3<|VGQ@9Qz?}o_%#AjaH(7@)cYf`*FAyA zE+QFzKBJC1TsLPkCU{l>fbF)c77GMdmRoddu*Mn$6~lTI2uUCorzV2YcrQG_QMpt+ zq1gu*ly{$R%ySQ1Kj zmY2f!unj?Q zP2d+{{T0GKbR$mxqp;@ug$DH!gG#m@zOme_kzXOe`DgG;o=$mB--P=Y19tCkiDdVl z_;mMlw)Y3`Nv^i)XB)WBC;%`mml%yKCgebcK^t6KY*hUh!0UWwQP6Zo4R@+;oN2;9 z$1GZf7X;oNjwgC!vBVJYGi;#gmWqTHqgwj;KqNlu56AlSO4*uni{`eIW7MzVK^_Ni z`2X4a4meAyD*dYWUcH=C=P)@l0|WDO6dV{p35p;hNhO1<>xzP~!%A`_tU4$`SR@Ap z^bd%F{8?PWB1yt943l%`?$ossK>Li+6|IR7;?0*qcD@^?`zSj^T7+y#nmem<{g)eJ@01h!k`2J1`b&sII&(W@L}c!C}jx74(D#2GF0IRB-&$%75I+@M)X>L z)^^xIEs+{P;%H7z10vII6PzQB4W8o+xt(8MwXN@>c&_*l zvzf1P*#xjFOC#0#1j9@R+_r`A^e3!o>wg%Y|E^k}>y%l|p=(L*A8zkEuUHmWQFn4Z zmG?pWKbqYXUV%q?s0wkN-~DX>zzg_1&J7fn88Z{wovc4|0HD)2AnrF>quyU8vZW6? z;@PJm*bVTweSVjH@#GrcB^$evk7HmCs}FdNC1b)s74Uh^Dp)*p`mRaccCW81SLncs z#J1k_Lp`a&^SYh^&F`uYx-Y4N@zWczOz{<}x=Tr6PFp}EkItW!J@Q&3U1(!xDOIJa zMP9-KdJFx3tSy$QpI#sMDN#QsloJYiSk&)493ElHj?TA3{b8 z5FT-$q(|F?@Z%rt=sy?WrkAUh^sG0{c#u)UOCOUilvm<8_c7p08;yq&WVuoW-<9?R z$H$$Fgt1)=hW7QYMD{e+-VvFYG6uOTEdMjy1+N~3S6xqse2`cqN!gGoQ~;P2`hk6F zZQv&8;hE5#Ct&<{A|yL%c60bY2|qXYByNWB6I*gHnaTax;=^Ephk}t^Oh9I}m}>BT zkm*zLvyeF5uK++(Te2d1;puLGLO#5yD@hw5NN~xh&w1Lky5RRVb|qFo>7Vg9tj#<- ziYl2eZ&}yge-r4Z9Y%0*pijd`fDop?&6X<|YFoK&)qS&6wmsiHK#h2Ol3W)ok z{;*JfyEW>&q9x+JuqrD&Siszw^}*X#xAlJu{q50>34Nvh>Rz-rkuO~-Y2gBA^tuj= z2W7^y#r;b?)nmEPNwjwn#_yM))T_}@7i({EZ$e#d|NZcvK?XfrdQ#W2IGuDu-DQXN z$kXZrH?~H6=K}oV2&YsU-xTql19_RDOR#;ZpUFPWeyct%Q>?rNu)dfoPScTYtPiF^ z)SvtGE;!h)06;NMZP0you_DDmU$0@$>j9NIYff|McD(m<7(dnNlg&I|Hqa#*v1_MT ztn8?W(s7{Ye+A8dm3dNKd&_K~Xs~5aMWqfqWuWF38R3BLU0}p*Q0RY$ERyhE zR}y%^fWH9nJR7mO8^Ld9okLbA)L6z`FMheZ{^|u&%~}XC z?6xLq2hFLYEe%s^{r3UoJjIHb#t*GSa}gswV^8IdpOzq_GSd@Dm%ra_I~MHlVmbi` z!1_MeWv3ci+J(8qI2Em6tjP2!XM8q=?i4anv$~V{|IZB^?y6pt+p2(}>4&58%1!_r zR9j^@)^7;I2K80p_L=_e9<28#0FulnNRIy=(YhpPS7Xa-pH`-HGm7F)B?Lo9L02=Ma zcPvBYPjbgMt!T$L5e`k?OSy}>UeI(hWO9T_Eyo4xE{mOHmDMtHybUt`8t(7fO^W4!PXd}?4#Yvxgw$L zFeoRh3XIQqZ9q!~U>LJgu$cIq$6-69CG5R3;Ib`-0#Yb)1q7YZ>9JPZkLM7J3pT-W zV%Y1r)MK|E6L8zst=!u8^-5Je5W>QZQni&7&BPB>0wSXdx*c>NC=9|u5AijJy+3r? zEvM?GNZ8R^CP@tmxGI`aHaKg}5HF`<>B3)vZu=KVQ=x1@Jj=&Ul_|k+6)>D*n!?`u zZGtJZp(}ZHcRcr?G9WWW*6JfRLBSscP%PQnWB$dqzVwaogn9J$*vU2iN8ri&S8nM& z3Gq}rGiEb9_+;GE4Wph8;P_X7*yr;laVw1b&+w+NAUxX`_Baj~C8^Yt%0EWT1_t*F z$oeFaoso$9AMSJ2JtLS*QnFBbcWrz85>6|YDH1UGoHiQ(;AGtAQm@mt1b@G^YJ1I&W@@c)pMD=$((+V&{PA?!dhyr&S0whCM65SiZHsBmR^2 z{_L$xAIhIb0FV*ezRu`qsVVHa5(1tBD)mmLP+83eHctz8cz(AuXIypDFraFsm59&z zt?BiF6@u9uC53Dbd(J@&ys0aZ`!%~Mp?L!s#L@-`ofh9fc@CirJV0R1tj5s&YuaMx z!IQO(q>O@AnRrm^NU^D3v1|c9;+IaV5B>xO^KMTvcjMfa$bB>`r3^Sv5#GpaGD9il z!O0~6mZF|=MRkzaLb@#3c`o~P>o+!ssM<^ zki&y8v>8NuC)N0uCG+Lg@LIz3`rvP&&^A!_+L?`^`_^^DzY95R!ru+E8pFSbAy&vc z0^~f}G1$UnDDh=YA@5~qS4FI<)os5)xCd`J-D|gg848^TxVh8PzB6I zp*0GXhLEQL270W+Dx8Jq*>K;(2pkEhi9w(pm!R!^40y)`0%mqf5MFjLzB+W?1lcwl zO0ub82!_WD^EYZ8fLM{)jE#c6Hj-SRCr=|(UC!E2U`$q`B?4ZDZR(U-|6`C(0b_75 zbihWmo`3_)fxzR(^t*gn+`4Le?wjY`YU6J?_ryRgT3JfqOGI+q99-ZQ5u^awn_mwJ-f42B$SyE?dD8WlpgVwHO{>4IB?4TKsVp-hr!PefTaj*k3JFF#^ zDZKOEmfnls+0;c|?HbDCVJxh8)+4n6_ixe9BRk@mC)Rf*uGi}2D_ou5b;6_?-*wD+ z2xHX`DmokSI=(rxA^2KL*z-zr*!QB_VOyk5)eb85vdd%~&uhgyOEAvG^I9U$xU9lL zP$wBidpv;HPswW?h$!XSI$CVmC>@GcCytesL!>oRytZz}&P z#wV@%52P8wMbulphE9`=BexW38r(6XA3D}pDrXJZiT0V^oU}qeT z!9JQ!N+rSMieei#nAY#x2SV_*0oTz8Gw$h46)69Z@;GgaTO-~JNXbEI8;J1}7E$gD zG`K-#$3%g`MnPq7+ti(?pH>(AF(tde488%Q>H!oP>*n3om$?>(lOIaQR2N>A2Tftw zt)}_4e&=(bpN%lk9O&(d7~HLRPH|{a8@NX&yu`=wHvbPEVQJXsJl#Y|Q99vBk~7I{ z@uhU3l7v#PFl2;uxDlX;e@C02YK{6Xrw{tl#SiiK3(RZKG2*2ivCJL#x6ALg9UpX? zsYErMlDi2Z+LQQq6-qeO=ddmKct`*Bc%Rl9I4Q)S1T0w8Y4A|j160;^#&ZtGBF^MyTVF!!*Ig@-v_}48Yb8H zE+r6XjrcAE2z7x5|B4&fM?d1)1NFEqkK?Sl&Een4YI09omOa)A)M#@N#(ok)tOl^B zo53bL0LfcgqQ3JA6|rq|cj|f=^Y0n(is)+z&g`WCbbDKG>ZWX|@?l#n^BVx#;d7cJ zw^_BL%4Axs#z0KKxX{#a6%1o8baDm(0GQ&mthF+COHcA9YVSh3Fb_;^5&=5&VX+W1 zO#-N_;l^1!HHfo{-^Z8f&z9Ks_>dA z(E{Zq-cHm{+_`0dS3^iMl%C=bccL=p!!h@YnA@}J3)FoqBo=ek( z)?Bf&d1F_CrctS#Svop?{-o$*0J~;{P`^&+OB+g}v{GNw0PuY|>UDk@0t;rE$*g^r1KvKfg{F91#lDF1ca`OJMa@SyN&KLDR!;IdoiD!bOT zQIeI}BIve% z4n|eGr8oHy*ijd2S8i0D;5jRd|IY4Y?gbqbLABpJ)F%7^4ruyreJ2P5^d`ac+7U36 zyQoS^CoL$WJu3hvFG8|KC9$|xpMr%a$wD3($mhoZuWJF0o4_FQ%C1aBUj(JgrD9-^ z6@?PvS`xUJ%9mc3wX7{~u+#lg1#7=Trff#SkdXwM#-KW<*7>ie2d&)N`-5b@^d?ilu`U6n0kc4%>5RC0(qIpW zEAN3PojJ^6B&y9w%47|?U0(-qE{3wz!p5rbCTsiBg{Pqq< z%szmg+U7@nu8X=8`9C&?J(SdH>qkhU>_vqeR;yq*2A{H8%t3g+TVQnYHSPV&!8+d8 z6K}hF4jC_upH@KnS)XzMz1~Ew^pe+Movw^fuZxdb#~{deD9a0NP-~C{779wV!88L@Cp}J(j7H zBss0=+W;db0pzu$$%q54Zh8^aN-jUdGyaw@sZ)x3Vi<#104)b=2zpMzJ6~y!XCDBn zKW3oe1#ZtyaFLm}Fl7ss|L#i_pKA!Y&opkvA*xA;zpXEQ2V%)o zMQVg7G}V09Vf&h~tpEM9jH0>RZtg@%@NKkCK4u!Lnvm|7a{ku+Rvt zzoJ=+c&_vhyx&KxgqRquyd=*rD{@+rht)$e?MiFJca_^FOy1m`cz`e#hMMe4=O51& z%O4|jJjQG`+s3)4geU!vcpP7(b^&;cJ<0r^nJtv}$28z4!T{*XmMDRwoJor1aR|-z z0oR%B{n?+Accd7IriEyqe=J>C%hqbEv8ghQBCFF?ZpRq_fQw+H&+Myy&~h~>d3i%u z^7>*~e2Xbzfg4zHsO*)lqd$o6{--|ZK6B6+Aprf7DDBAP%kQyldc`o)Kw114yv(aj zVQr85{ssU_J|SFaLOU;#6p3ay^!58Cts{Jy!jpaFkRW!%+ER9XXW}~O%t|H$eVKQ4 zJbhBMou@}de9p5rbti9w9fj)yo>O7_c5*&2D%wL~3b-9hX@wv3?c*JNX)@qE`ke;o z9W|X2#IjOA_~1a>Z1DbdY=xfgG)gX;a7fhWIG?6N0T?<+lvp@dQuZLh4I3y57E4Xo z>-aXwc1utCzraF2VE6r0E(F?nfy%sC7QKCf#T=y&cv94Vey${b0FU=ru_Af{Zrc)g zmk-yp$FF6FCgib*ranDnT2pHLXC(`z9biX<98n4)}Q^$rmn;tFyQT!_o0{{ zY;ygU-sDYHNv$#^BYc>RFzg5`$A^q81EJ8-l&_%B0^ZuM%Z3WqAY7|JX~$Q=N#Q6# zD^9KRFL&967J%2iU5V^t3<%TvYsT!8stL%KD%Fi0@!Wrz8NCF$`erwVRs=ovGbYve zm!}JrH6L#8yI7w}p}5cMv`P4$NnhWBfvrY;uA>%As(r33O6iXN%)=}zFA>`qB6MXB zEmdMdFX+Zkvl&#xVZ7&d^1OD2JSC41k5W~d2E^j?h6cfugo2`n;C+sB+l3>XHem{4 zNt+%L8T&(jLWaT^jbAY&$kY>Rjc1}lUV5m(gMBHwQBq%B4q=+kwjv(q5uAP?3r*k) zCXZQNO1n$GMK-)+8SXiH2scdIb-C;7EM&jauJ&IUpPuqP$=n~>`!jcQ+NLPlH-+*s44TwLp~Zw4-eenQEJg@v)xMWnqu%8Km+g$T?eU+Xt+z5eNN{_( zgYrON0BYmg`ZIT6P?vElOXB8LJNhnSYroa)m?UiSS`|s1D^`Gt z^BaSn3md~8+M6w{+TMRrRaV!+t4n_SQhBa1=(h5P%q}-@pa?f8N1zOxJk92Nc6wu= z{q%%TZYYaYqF%DYX5oTv`!vwt&vhnpPqHP(V;T&arlk57A&=wpxbL|kkNwMFK+UQF z7%+eq$~Xk`tb>}v57Tl~JgW!nXcd^w>%~g-ImE=P(bo#Ab6D+6=KjL!AR719v#ot9 zl`t7Yhylgpn*c=9^$k8y;wYyrP|4Q>+y@~%>B|)>J)$HL+fnN$hyaa%+rFSa;64Lh z`e#0eZ4Sm@8TvtsT-5cnCQbz;8Orab{R~c<1(+#J*JrY9R&#`wF4LMJ16a_qV7q>7 zG8o6qbfH{BW#Q;^n%1P}I;xhL-HF^E$D?a(5fU6TFT#V*s|&ck0d~1M0WdU5IF@ODN>kW-4Cwz?EGFI&&lOkZ%hjGtvGTE& zy3ls_PzVt9IhXXN9Vg)#w+CJJLu!LAs_5iqdrVAh%?AOjo6Y|ZI$xQ>jA`|O>-|pK zw3S=?&Y>A276xSuGf&*7830u6gHk2dcJyB|r#bu}jA60F>i0RU=GKLiYo5#$Dj#Nx z<^P4C*Apt!Vi=p*JbP+w;0OQ$oT3oM;H4={U<+1Av2!#F)>`Ac8cMW~?nj;sgL^!} zi$CN0uQTfxcDi_3$x~vI20H9<9^-RZ=W6fEREhU1A-7`@LYC)yQu#-~LhAi4``6lH zna4P7%+0%_V`Ql0sbL7NsNZ!%L(qMx-C}Y|+P+h6#92$#m}C=xu|Djz)Q3Ix<4aZP zM*xtQ@VjEQDwp9MZs|?upJj@ndP-V_2<8;m={4lk(irlbhnwa);@K6<19Pnr@4tg# zw9xlyDiVD?4w_tmj8=Ia*7>n?{wf_XlKIl#AEdR1zNG_5G?Z% zqRpk})rZ{210<)!GQ}t3*}_u|AdrqA*@g{8?@@weQ-u0UyQ%uC&=CjxY%Ga3T4x-bGX z2wHrmL+M!<)5-XJvdq?y5C(yXE>SakqLjjS9bjYvF-qEniLs~3Qh7<6id7SG>0;$= z!~Oy@%^LN(^K)pYV|#!0A*a=H2%bx8U--t5`&8)rg5Ff&Ufl0x1_mz8S(uI{cy}>}hWRWRL>gOu*ZOt%5nI3(RUZhnvHm zGYgd}m8`mqR-Uo=IIeqn^oKL0`1fG+>Tlqso2owfxD8#2E1<;sxr!1D@3**590q!! zT`-4X3_?r9dwNHI&ViV78Ty!DeXP(L_pU_#aeRJ0frV8tIjv^X`Rc)qJMo_(@d7K@D`@1;QSCJc!gviuTtbxTj`YGTm9NH0yf zfho)f;DsnsvYYsZ$u<6esSkP1NBn*lfc_dV#jerhK3pQuV%CgmMt$&ko5kFOaNq^> zySqXlNijN@CoM|{fK7JUEK_M?4}lc{w_xEt(2*d*%liOWZ?I6%Vqh-n*?!QO=X%ol zrvRd-5{QB2gm9l4^zS+_s7=|T_`b(sYoyr+n)dF?BwvK_liu-QB~CDfFOs9`PUZi; ztuOr$nAh7(pGCur)Bdky{Yf4Usyj#~P&Yivku^T&S0Rie95$hWre4TE6<$jX(Qy~$$0F#LM}3=bG&p)a~oL2Pbw_#wp2UxeX5Ksgtxi$UHAMq4w# zHSz>J-SjmbiJST}g+DO`PO&zcA=5?E>ipLN@Q&Qlo1$`PcR}6s@ynylVF1xQ7|7xE z0oT|3Zu`6p#%^;@>NWt~bB26CaU{8$hn#(&sNA1-&T0%l3=oPV?0gt;eS#ZUg{W8b zp;@O0g$Mwruhj-z#{l#;YpvR@UXL7?B8X=GwPOH!g#cIH(Rz+4Ye$`II!aEQLZ!-u-Ur%mCNPTIq4a#&v zu_C6*qO_fTx5w?Uwqh_|gR(WitK8b1%st8ms-Fql!n_PE@Th^|9hEPN9Yw9|Sc%cG z!dNr0U^hP^K-t`#yagUI&)P;xltTNKESMC12G217fCK;t{djF#?1zZ;bpxarwie#? z^N>Los{>eMNukn^gpyv>I}~u)kAY#~ z$X!5R5lPsOKzp`Ss`3`rri{V(cU7XHOCYsuF+Zi&cQdh$t-YxmSn^Ub7_nlIg|0V# zgjq+SAGGXuJL_l0Fy`_|33S@jV-qYh0bCy$< zA7D&7nGCW9*(;;Z7JN1Uz!-uEObJYezsGsbqxW$GHS={v5V)PW0!}{@DmTtW7(6_uOVW0qxY+&GcGG@@fZMU; zpw`F>__xCd05j@CSFCOC|2JCB$`rw5kb|AcK%W~|Mo>t7+pL?(smKl4L1&P={xYup zuMWf3bjIc~j6v1#nU!VRhg+HmKxjPLr0_D*b01eeI(q$N9{pY6F zt=-s_Tn?arg#A7{#Q1f6;SGJzpDi0_fOePXHT>SrmN44@i4l7U7aTIS3GhHWh z1LeRZgMt>v&=!5^u|AJJ+IOo4uUH)AyOIHb%R{~=8RRz7J@n_8xSgAe292R?xR+7x z(paWBM=%B}g_6w?@1+2Mrx?o{&a)bi>#njk8v8hwF_#SbSs3y={hm6Qsg;Ro**Bea z!Ny9RZl-eUQNQzSu_|R^8MUV4ekuNOAOe6<5#)Wa*g^4vce(7AL!v(S1+bpUU5VTu zp$N2@Mh_XXyUDI9d)W?M0mKm$k7%)7ja}iewBj|q#iY%v^Fx$qylqj&p*Umxt~?6x z%KPv+%03u>t|C_3*LNoVRWS1{+{pDf_eO5x`K>(IF({>2rtsHEHU7(X^rdg~IBnfF zi^*l?`BSDh1Rnu2xCsF80=FNw{T`?xz&^jCKIhR9uk$;IgWv8=75)luoM048`XsZf zBVB%%ZSm};&;y*pyJ>w}I$vH50q>658;#p zq-{!FzCU8d{(rVij$N<|9UD_sb66+A@?ah+x`H!^t^?_jia96Cv>UB zWijRv~wMLnU3lwSQSRn)d>I?y8>7ZVTF7E8I&H^JDD=b+~6s$GPj@BeNS8m z)c6}&fxr#S6p5obstEuXpP&y^FS@g!=a6=eCjm8aefoibA2R-Xn)p000bt^qxF)Ux zKVdR)O|_7{ literal 0 HcmV?d00001 diff --git a/resources/searchers/unused/KinoZalTV.py b/resources/searchers/unused/KinoZalTV.py new file mode 100644 index 0000000..d174990 --- /dev/null +++ b/resources/searchers/unused/KinoZalTV.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +''' + Torrenter plugin for XBMC + Copyright (C) 2012 Vadim Skorba + vadim.skorba@gmail.com + + This program 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. + + This program 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 this program. If not, see . +''' + +import re +import os +import urllib +import tempfile +import sys + +import SearcherABC + + +class KinoZalTV(SearcherABC.SearcherABC): + ''' + Weight of source with this searcher provided. + Will be multiplied on default weight. + Default weight is seeds number + ''' + sourceWeight = 1 + + ''' + Relative (from root directory of plugin) path to image + will shown as source image at result listing + ''' + searchIcon = '/resources/searchers/icons/KinoZalTV.png' + + ''' + Flag indicates is this source - magnet links source or not. + Used for filtration of sources in case of old library (setting selected). + Old libraries won't to convert magnet as torrent file to the storage + ''' + + @property + def isMagnetLinkSource(self): + return False + + ''' + Main method should be implemented for search process. + Receives keyword and have to return dictionary of proper tuples: + filesList.append(( + int(weight),# Calculated global weight of sources + int(seeds),# Seeds count + str(title),# Title will be shown + str(link),# Link to the torrent/magnet + str(image),# Path/URL to image shown at the list + ))''' + + def search(self, keyword): + filesList = [] + url='http://kinozal.tv/browse.php?s=%s&g=0&c=0&v=0&d=0&w=0&t=1&f=0' % urllib.quote_plus(keyword.decode('utf-8').encode('cp1251')) + + headers = {('Origin', 'http://kinozal.tv'), + ('User-Agent', + 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 YaBrowser/14.10.2062.12061 Safari/537.36'), + ('Referer', 'http://kinozal.tv/')} + + response = self.makeRequest(url, headers=headers) + if None != response and 0 < len(response): + response = response.decode('cp1251').encode('utf-8') + #print response + bad_forums = [2,1,23,32,40,41] + regex = '''onclick="cat\((\d+)\);".+?(.+?).+?(.+?).+?class='sl_s'>(\d+).+?class='sl_p'>(\d+)''' + for (forum, topic, title, size, seeds, leechers) in re.compile(regex, re.DOTALL).findall(response): + if int(forum) not in bad_forums: + image = sys.modules["__main__"].__root__ + self.searchIcon + link = 'http://kinozal.tv/download.php/' + topic + '/[kinozal.tv]id' + topic + '.torrent' + filesList.append(( + int(int(self.sourceWeight) * int(seeds)), + int(seeds), int(leechers), size, + self.unescape(self.stripHtml(title)), + self.__class__.__name__ + '::' + link, + image, + )) + return filesList + + def check_login(self, response=None): + if None != response and 0 < len(response): + if re.compile('').search(response): + print 'KinoZal Not logged!' + self.login() + return False + return True + + def getTorrentFile(self, url): + self.timeout(5) + + content = self.makeRequest(url) + #print content + if not self.check_login(content): + content = self.makeRequest(url) + #print content + + return self.saveTorrentFile(url, content) + + def login(self): + data = { + 'password': 'torrenter', + 'username': 'torrenterpl', + 'returnto:':'' + } + self.makeRequest( + 'http://kinozal.tv/takelogin.php', + data + ) + self.cookieJar.save(ignore_discard=True) + for cookie in self.cookieJar: + uid,passed=None,None + if cookie.name == 'uid': + uid=cookie.value + if cookie.name == 'pass': + passed=cookie.value + if uid and passed: + return 'uid=' + uid+'; pass='+ passed + return False \ No newline at end of file diff --git a/resources/settings.xml b/resources/settings.xml new file mode 100644 index 0000000..81b3298 --- /dev/null +++ b/resources/settings.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/utorrent/__init__.py b/resources/utorrent/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/resources/utorrent/__init__.pyc b/resources/utorrent/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa99d857b82e056caa059cce2c8aaa45c0871181 GIT binary patch literal 183 zcmZ9GK?(vf3`Hxt5W#!Q#yNnfIOtAr;ovS%%Opr)rYTJ;cwkT91`isp+IBWYBbkMVg4Wwb*C-dg_1yngAdTecy`&rjh(JfxG;Kfh#UlB uU!FeHFOS4^=9DO8N{~pnq>cp2B*9uAe73fZ@4VC_yMeLvbQoU|jrjqJhcI9O literal 0 HcmV?d00001 diff --git a/resources/utorrent/__init__.pyo b/resources/utorrent/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..123503a8ab274c65ede25e2ad7255e04b560a7bf GIT binary patch literal 183 zcmZ9GK?(vf3`Hxt5W#!Q#yNnfIOtAr;ovS%%Opr)rYTJ;cwsN#1`isp+IBWYBbkMVg4Wwb*C-dg_1yngAdTecy`&rjh(JfxG;Kfh#UlB uU!FeHFOS4^=9DO8N{~pnq>cp2B*9uAe73fZ@4VC_yMeLvbQoU|jrjqKIxt}X literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/__init__.py b/resources/utorrent/dopal/__init__.py new file mode 100644 index 0000000..c26f6b9 --- /dev/null +++ b/resources/utorrent/dopal/__init__.py @@ -0,0 +1,65 @@ +# File: __init__.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +__version__ = (0, 6, 0) +__version_str__ = '%s.%s' % (__version__[0], ''.join([str(part) for part in __version__[1:]])) +__user_agent__ = 'DOPAL/' + __version_str__ + +__all__ = [ + + # Module variables. + '__version__', '__version_str__', '__user_agent__', + + # Front-end modules. + 'interact', 'main', 'scripting', + + # Core-level modules. + 'aztypes', 'core', 'debug', 'errors', 'utils', 'xmlutils', + + # Object-level modules. + 'classes', 'class_defs', 'convert', 'objects', 'obj_impl', 'persistency', + 'logutils', +] + +# Mode definitions: +# 0 - Normal behaviour - should always be distributed with this value. +# 1 - Debug mode - raise debug errors when appropriate. +# 2 - Epydoc mode - used when Epydoc API documentation is being generated. +__dopal_mode__ = 0 + +__doc__ = ''' +DOPAL - DO Python Azureus Library (version %(__version_str__)s) + +@var __version__: DOPAL version as a tuple. +@var __version_str__: DOPAL version as a string. +@var __user_agent__: User agent string used by DOPAL when communicating with + Azureus. +@var __dopal_mode__: Debug internal variable which controls some of the + behaviour of how DOPAL works - not meant for external use. + +@group Front-end modules: interact, main, scripting +@group Core-level modules: aztypes, core, debug, errors, utils, xmlutils +@group Object-level modules: classes, class_defs, convert, objects, obj_impl, + persistency, logutils +''' % vars() + +# If we are in debug mode, auto-detect whether Epydoc is running and adjust the +# mode accordingly. +import sys + +if __dopal_mode__ == 1 and 'epydoc' in sys.modules: + __dopal_mode__ = 2 +del sys diff --git a/resources/utorrent/dopal/__init__.pyc b/resources/utorrent/dopal/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ef8c368acb68fc93efa92a5cbdb7fa694e84c76 GIT binary patch literal 1489 zcmZuxUvJws5I_Hk6DvvoBwM>S+j@Hl-~x*KZWKd;8hcsM6e$J_o;HCNX_<~pY9!^< zeeFls*V@}Y%09q$q~tg)DnO^ZBk#xK-S5=-_b@vD>(_Ax&2voOb9(JRB>49*A=w5& z65t8%z@h~?1iK5*#=jrIgjPEs+VHUjf3)GxAG|Va!=p(T_zs9JJf7?T?*ZQhz6ZPy zJOaKC`~dhN@O!}T1AhSgA@C#M$H2b={x$GNz#jwu2J&N=P%OZN!k>WHgO5Pigz^;l z2^0}bA`rCJh3ht$zkz=XB7(&}T=#p3|&)#R{a0Nj5D6-ppk-Cq(6pE-YHT6sTwD=E7r6#hk6Au8jB1_01*=ZLTd9 zR%wSz!IZ<9HYnZ`V>~#eJfz~~Mpq^NWC;6AD2|j$RR}w(vmk24=y?_6EvYs!uZT-$ zg;8t09s)Sr1H_(!sPZpsZ_OQ}O{}!B*HAnXg8PC!0+!_)@CmqAbVE zvE)iKGV|nT&1J$k*UBbkQRPw%SCR`oblMpDO9+z~VTl=;uu0W8laO7Krcz1zj||It oDqq%V{P>WLwNFX(TBBC9)9>^QD$i6l9Q&>i6@?3nyE8xdr{eNAOfNwlK=~V za+GTxrZ3Z5AEgh_EbHL2JLf9-&ge7zew<}VM?+K zf+WBb-h*WaatL-Go?ZNQ1XEh=f#|}=4!rBa@85W3-i1fgKJXn7eRw?G0X_h}3w#gw z5O@T9ANT?AL*Vy--v|Bx_(R}Fz>k4{2K;m2kAOc0{srX6Fr`?4DTO})u?HW4unFZU z@DnH^m_{IItq<2-FnceYhS3^D7^z0Dh%YPvED~GrE_g7vzA1-63&m$EVf> zU&s6W!o}s=^EWTtKB;NC62?lc($wAmk8PbH-@V|gtuQIeg>vNDBbQW87?wHLC!=I! z4oR_@k(HAwce`Y<4{luv8@6QH2Z50DkiS^|hR zddkJz2JB2L%G(89&z2%{O+4wTEUO~it@1asPN-}hzzdxRaJ%dRM4*_%J^5xK6lS_CYb7)08-X{{Eh5Ct-EM)ou2_+l znv2vY?z@7asfray7n5vO2)tRyY(a?18C_Vkx)iAA=oZ3b&cuSPq^^zkE%ePM3vI3~ z6;^47rC`e8TpJYci7_6WQXW(Ba--`Czc++^CKN|Xr7nb>G+7X}V)VR<@s?DZnAgOm zvqG#yu?=du7E`W9#28o>V?(hRL)T;6kZS{U8Hn>KRLeSo^7IRo^RR($F}7q2N?=;- zE73l82p8jqZIS$ko*x^|S8J{_N%VtJkHmIXgEl%K-<2QJFf>a|9q|KJF`~NPPhG$A z!B^f0Q1RZ-_sjaQNjJ$Bj{`b!9t7-5MSnXpOSI+KuHlBQBg`j3pO pW-7mJ()jKn9c!PG7<49`XlK|P_Ktc-o#F1_!D0WPd(s(p{sn9Lp?d%T literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/aztypes.py b/resources/utorrent/dopal/aztypes.py new file mode 100644 index 0000000..511e49b --- /dev/null +++ b/resources/utorrent/dopal/aztypes.py @@ -0,0 +1,367 @@ +# File: aztypes.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +''' +Utilities used to convert basic values between DOPAL and Azureus. +''' + +__pychecker__ = 'no-unreachable' + +import types + +from dopal.errors import ArgumentWrapError, WrapError, UnwrapError, \ + InvalidWrapTypeError, InvalidUnwrapTypeError, InconsistentWrapTypeError, \ + NoSuchAzMethodError, IncorrectArgumentCountError, MethodArgumentWrapError, \ + raise_as + + +# +# Methods / classes related to type wrappers +# +class TypeWrapper: + def __init__(self, xml_type, xml_value): # TypeWrapper + self.xml_type = xml_type + self.xml_value = xml_value + + def get_xml_type(self): # TypeWrapper + return self.xml_type + + def as_xml(self): # TypeWrapper + return self.xml_value + +# Stores the type name to _wrapobject mappings. +_wrap_value_dict = {} + + +class _wrapobject(object): + # If it is a native type, then it means that you can wrap the + # object without having to return a TypeWrapper instance. + native_type = False + + def __init__(self, type_name, instance_type): # _wrapobject + self.type_name = type_name + self.instance_type = instance_type + _wrap_value_dict[type_name] = self + + def __call__(self, value): # _wrapobject + return self.wrap(value) + + # Only used if the value is not an instance of the type specified in + # instance_type. + def normalise_for_wrapping(self, value): # _wrapobject + raise WrapError("invalid type of object for %s: %s" % (self.type_name, type(value)), obj=value) + + # Converts the value into a form where it can be added to a wrapper + # (usually as a string). For certain types (native types, like String, + # integer, long, float, boolean), it can return a value with one of those + # types instead. + def wrap_value(self, value): # _wrapobject + if not isinstance(value, types.StringTypes): + value = str(value) + return value + + def wrap(self, value, force_wrapper=True): # _wrapobject + + if self.instance_type is None or not isinstance(value, self.instance_type): + try: + value = self.normalise_for_wrapping(value) + except (TypeError, ValueError), error: + raise_as(error, WrapError) + + if self.native_type and not force_wrapper: + return value + + if self.wrap_value is None: + raise InvalidWrapTypeError(obj=self.type_name) + + value = self.wrap_value(value) + return TypeWrapper(self.type_name, self.wrap_value(value)) + + def unwrap(self, value): # _wrapobject + if self.unwrap_value is None: + raise InvalidUnwrapTypeError(obj=self.type_name) + + try: + value = self.unwrap_value(value) + except (TypeError, ValueError), error: + raise UnwrapError, error + + return value + + def unwrap_value(self, value): # _wrapobject + return value + + def __str__(self): # _wrapobject + return '' % self.type_name + + +class _wrapnative(_wrapobject): + native_type = True + + # I know that it is confusing that the arguments are swapped round... + def __init__(self, type_obj): + _wrapobject.__init__(self, type_obj.__name__, type_obj) + self.normalise_for_wrapping = type_obj + self.unwrap_value = type_obj + self.wrap_value = type_obj + + +def _value_as_boolean(value): + # Although this library is intended to be Python 2.2 compatible (i.e. + # before booleans were introduced), we only support versions of Python 2.2 + # where False and True global constants are defined. + if value in [False, 0, 'False', 'false']: + return False + elif value in [True, 1, 'True', 'true']: + return True + else: + raise ValueError, "does not represent a boolean value" + + +def _boolean_as_string(value): + if value: + return 'true' + else: + return 'false' + + +wrap_int = _wrapnative(int) +wrap_long = _wrapnative(long) +wrap_float = _wrapnative(float) + +# We create it without passing an instance type, and then attempt to assign it +# afterwards - Python 2.2 compatibility. +wrap_boolean = _wrapobject('boolean', None) +import sys + +if sys.version_info >= (2, 3): + wrap_boolean.instance_type = bool + wrap_boolean.native_type = True +wrap_boolean.normalise_for_wrapping = _value_as_boolean +wrap_boolean.wrap_value = _boolean_as_string + +# This function is a bit overkill for our needs, but it will suffice for now. +wrap_boolean.unwrap_value = _value_as_boolean + +# We don't set normalise_for_wrapping, we want to impose a string type here. +wrap_url = _wrapobject('URL', types.StringTypes) +wrap_file = _wrapobject('File', types.StringTypes) + +wrap_short = _wrapobject('short', int) +wrap_short.normalise_for_wrapping = int +wrap_short.wrap_value = int +wrap_short.unwrap_value = int + +from dopal.utils import string_to_hex_form, hex_string_to_binary + +# None - let the below functions deal with non string values. +wrap_byte_array = _wrapobject('byte[]', None) +wrap_byte_array.normalise_for_wrapping = string_to_hex_form +wrap_byte_array.unwrap_value = hex_string_to_binary +del string_to_hex_form, hex_string_to_binary + +wrap_string = _wrapobject('String', types.StringTypes) +wrap_string.normalise_for_wrapping = str +wrap_string.native_type = True + + +def _unwrap_void(value): + if value == '': + return None + else: + raise ValueError, "non-null return value: %s" % value + + +wrap_void = _wrapobject('void', None) +wrap_void.wrap_value = None # Not an argument type. +wrap_void.unwrap_value = _unwrap_void + + +def wrap_value(value, value_type, force_wrapper=False): + if hasattr(value, 'get_xml_type'): + stored_type = value.get_xml_type() + if stored_type != value_type: + raise InconsistentWrapTypeError(stored_type, value_type) + return value + + try: + converter = _wrap_value_dict[value_type] + except KeyError: + raise InvalidWrapTypeError(obj=value_type) + else: + return converter.wrap(value, force_wrapper=force_wrapper) + + +def unwrap_value(value, value_type): + try: + converter = _wrap_value_dict[value_type] + except KeyError: + raise InvalidUnwrapTypeError(obj=value_type) + else: + return converter.unwrap(value) + + +def is_java_argument_type(java_type): + return getattr(_wrap_value_dict.get(java_type), 'wrap_value', None) is not None + + +def is_java_return_type(java_type): + return getattr(_wrap_value_dict.get(java_type), 'unwrap_value', None) is not None + + +def get_component_type(java_type): + if isinstance(java_type, str): + if java_type[-2:] == '[]': + return java_type[:-2] + return None + + +def get_basic_component_type(java_type): + while True: + component_type = get_component_type(java_type) + if component_type is None: + return java_type + java_type = component_type + + # This can't happen, but it just stops PyChecker getting worried about it. + return None + + +def is_array_type(java_type): + return get_component_type(java_type) is not None + + +class AzMethod(object): + def __init__(self, name, arguments=(), return_type='void'): # AzMethod + object.__init__(super) + self.name = name + self.arg_types = arguments + self.arg_count = len(arguments) + self.return_type = return_type + + def has_return_type(self): # AzMethod + return self.return_type == 'void' + + def wrap_args(self, *args): # AzMethod + if len(args) != self.arg_count: + raise IncorrectArgumentCountError, (self.name, len(args), self.arg_count) + + result = [] + for i in range(self.arg_count): + try: + result.append(wrap_value(args[i], self.arg_types[i])) + except WrapError, error: + raise ArgumentWrapError(i, args[i], self.arg_types[i], error) + + return result + + def __eq__(self, other): # AzMethod + if not isinstance(other, AzMethod): + return False + for attr in ['name', 'return_type', 'arg_types']: + if getattr(self, attr) != getattr(other, attr): + return False + return True + + def __ne__(self, other): # AzMethod + return not (self == other) + + def __str__(self): # AzMethod + arg_string = ', '.join(self.arg_types) + return "%s %s(%s)" % (self.return_type, self.name, arg_string) + + def __repr__(self): # AzMethod + return "AzMethod [%s]" % self + + +class AzureusMethods(object): + def __init__(self, methods=None): + object.__init__(self) + self.__data = {} + if methods: + map(self.add_method, methods) + + def add_method(self, az_method): + methods_dict = self.__data.setdefault(az_method.name, {}) + method_args_seq = methods_dict.setdefault(az_method.arg_count, []) + + if az_method not in method_args_seq: + method_args_seq.append(az_method) + + def get_method_names(self): + names = self.__data.keys() + names.sort() + return names + + def get_method_arg_count(self, name): + try: + result = self.__data[name].keys() + except KeyError: + return [] + else: + result.sort() + return result + + def match_method_spec(self, name, argcount): + try: + return self.__data[name][argcount] + except KeyError: + try: + argcounts_dict = self.__data[name] + except KeyError: + raise NoSuchAzMethodError, name + argcounts = argcounts_dict.keys() + argcounts.sort() + raise IncorrectArgumentCountError, (name, argcount, argcounts_dict.keys()) + + def get_matching_methods(self, name, args): + methods = self.match_method_spec(name, len(args)) + accepted_methods = {} + rejected_methods = {} + for methodobj in methods: + try: + accepted_methods[methodobj] = methodobj.wrap_args(*args) + except ArgumentWrapError, error: + rejected_methods[methodobj] = error + + if not accepted_methods: + raise MethodArgumentWrapError, (name, rejected_methods.items()) + + return accepted_methods.items() + + def wrap_args(self, name, args): + method_data_tpls = self.get_matching_methods(name, args) + if len(method_data_tpls) > 1: + method_data = self.resolve_ambiguous_method(args, method_data_tpls) + else: + method_data = method_data_tpls[0] + + return method_data[1], method_data[0].return_type + + def resolve_ambiguous_method(self, args, method_data_tpls): + # XXX: We'll implement something cleverer at a later date. + return method_data_tpls[0] + + def get_all_methods(self): + result = [] + for method_name, method_dict in self.__data.items(): + for argcount, method_seq in method_dict.items(): + result.extend(method_seq) + return result + + def update(self, azmethodsobj): + for azmethod in azmethodsobj.get_all_methods(): + self.add_method(azmethod) diff --git a/resources/utorrent/dopal/aztypes.pyc b/resources/utorrent/dopal/aztypes.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e4d1391f55b3ab9d78a5b051d46dbdebe4b2424 GIT binary patch literal 14950 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 literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/aztypes.pyo b/resources/utorrent/dopal/aztypes.pyo new file mode 100644 index 0000000000000000000000000000000000000000..f944d94ea0aad74f3df7a2c63c99c12c3af3eed4 GIT binary patch literal 14950 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 GZu~C*28rwd literal 0 HcmV?d00001 diff --git a/resources/utorrent/dopal/class_defs.py b/resources/utorrent/dopal/class_defs.py new file mode 100644 index 0000000..ccfb4a9 --- /dev/null +++ b/resources/utorrent/dopal/class_defs.py @@ -0,0 +1,5016 @@ +# File: class_defs.py +# Library: DOPAL - DO Python Azureus Library +# +# This program 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; version 2 of the License. +# +# This program 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 ( see the COPYING file ). +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +''' +Defines all constants, variables and methods available on classes in Azureus's +plugin API. + +Not all classes are defined here are mentioned in this API documentation +(simply because too much documentation will be generated). + +For each class that DOPAL has explicit support for, there will be a class +defined here which contains the class information. The list of classes +supported in this version is described in L{classes}. + +For each class that we support, there will be a class in this module with the +same name with the suffix of "DataType". It will have a C{get_xml_type} method +defined on the class. It may have some of the following attributes on the +class: + - A C{__az_methods__} attribute (which will be a L{AzureusMethods} + instance) - defining what methods we support. These correlate to the + methods defined on each class. + - A C{__az_constants__} attribute (which will be a dictionary) - defining + what class constants are defined. These correlate to the constants on + the class. + - A C{__az_attributes__} attribute (which will be a dictionary) - defining + what attributes will be on the object. These attributes are unique to the + XML/HTTP plugin. The plugin defines certain precalculated 'attributes' when + returning the data for a given object, by invoking certain methods on the + object. This saves the client making multiple calls on an object to + retrieve certain pieces of information, by calculating it and returning it + all in one go. + +If you are interested to know what methods are available on each classes, then +please look at Azureus's own +U{Javadoc API documentation}. + +The meta-attributes for these classes are defined by the XML/HTTP plugin - you +can find their definitions in the +U{GenericRPAttributes.java} +source file. +''' + +# +# The contents of this module are automatically generated by +# class_defs_make.py. +# + +import dopal.classes +from dopal.aztypes import AzMethod as _method +from dopal.aztypes import AzureusMethods + + +# ------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins +# +#------------------------------------------------------------------------------ + +class LaunchablePluginDataType: + def get_xml_type(): + return "LaunchablePlugin" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('initialize', ['PluginInterface']), + _method('process', [], 'boolean'), + _method('setDefaults', ['String[]']), + ]) + + +class PluginDataType: + def get_xml_type(): + return "Plugin" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('initialize', ['PluginInterface']), + ]) + + +class PluginConfigDataType: + def get_xml_type(): + return "PluginConfig" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'CORE_PARAM_BOOLEAN_FRIENDLY_HASH_CHECKING': "CORE_PARAM_BOOLEAN_FRIENDLY_HASH_CHECKING", + 'CORE_PARAM_BOOLEAN_MAX_ACTIVE_SEEDING': "Max Active Torrents When Only Seeding Enabled", + 'CORE_PARAM_BOOLEAN_MAX_UPLOAD_SPEED_SEEDING': "Max Upload Speed When Only Seeding Enabled", + 'CORE_PARAM_BOOLEAN_NEW_SEEDS_START_AT_TOP': "Newly Seeding Torrents Get First Priority", + 'CORE_PARAM_BOOLEAN_SOCKS_PROXY_NO_INWARD_CONNECTION': "SOCKS Proxy No Inward Connection", + 'CORE_PARAM_INT_MAX_ACTIVE': "Max Active Torrents", + 'CORE_PARAM_INT_MAX_ACTIVE_SEEDING': "Max Active Torrents When Only Seeding", + 'CORE_PARAM_INT_MAX_CONNECTIONS_GLOBAL': "Max Connections Global", + 'CORE_PARAM_INT_MAX_CONNECTIONS_PER_TORRENT': "Max Connections Per Torrent", + 'CORE_PARAM_INT_MAX_DOWNLOAD_SPEED_KBYTES_PER_SEC': "Max Download Speed KBs", + 'CORE_PARAM_INT_MAX_DOWNLOADS': "Max Downloads", + 'CORE_PARAM_INT_MAX_UPLOAD_SPEED_KBYTES_PER_SEC': "Max Upload Speed KBs", + 'CORE_PARAM_INT_MAX_UPLOAD_SPEED_SEEDING_KBYTES_PER_SEC': "Max Upload Speed When Only Seeding KBs", + 'CORE_PARAM_INT_MAX_UPLOADS': "Max Uploads", + 'CORE_PARAM_INT_MAX_UPLOADS_SEEDING': "Max Uploads Seeding", + 'CORE_PARAM_STRING_LOCAL_BIND_IP': "CORE_PARAM_STRING_LOCAL_BIND_IP", + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # List getPluginListParameter(String, List) + # Map getPluginMapParameter(String, Map) + # void setPluginListParameter(String, List) + # void setPluginMapParameter(String, Map) + # + __az_methods__ = AzureusMethods([ + _method('addListener', ['PluginConfigListener']), + _method('getBooleanParameter', ['String', 'boolean'], 'boolean'), + _method('getBooleanParameter', ['String'], 'boolean'), + _method('getByteParameter', ['String', 'byte[]'], 'byte[]'), + _method('getFloatParameter', ['String'], 'float'), + _method('getIntParameter', ['String'], 'int'), + _method('getIntParameter', ['String', 'int'], 'int'), + _method('getParameter', ['String'], 'ConfigParameter'), + _method('getPluginBooleanParameter', ['String', 'boolean'], 'boolean'), + _method('getPluginBooleanParameter', ['String'], 'boolean'), + _method('getPluginByteParameter', ['String', 'byte[]'], 'byte[]'), + _method('getPluginConfigKeyPrefix', [], 'String'), + _method('getPluginIntParameter', ['String'], 'int'), + _method('getPluginIntParameter', ['String', 'int'], 'int'), + _method('getPluginParameter', ['String'], 'ConfigParameter'), + _method('getPluginStringParameter', ['String'], 'String'), + _method('getPluginStringParameter', ['String', 'String'], 'String'), + _method('getPluginUserFile', ['String'], 'File'), + _method('getStringParameter', ['String'], 'String'), + _method('getStringParameter', ['String', 'String'], 'String'), + _method('save'), + _method('setBooleanParameter', ['String', 'boolean']), + _method('setIntParameter', ['String', 'int']), + _method('setPluginParameter', ['String', 'byte[]']), + _method('setPluginParameter', ['String', 'int']), + _method('setPluginParameter', ['String', 'String']), + _method('setPluginParameter', ['String', 'boolean']), + ]) + + # + # The following constants are not defined here, because their types + # are not available in DOPAL: + # + # "cached_property_values" (has type "java.lang.Object[])" + # + __az_attributes__ = { + 'cached_property_names': 'String[]', + } + + +class PluginConfigListenerDataType: + def get_xml_type(): + return "PluginConfigListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('configSaved'), + ]) + + +class PluginEventDataType: + def get_xml_type(): + return "PluginEvent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PEV_CONFIGURATION_WIZARD_COMPLETES': 2, + 'PEV_CONFIGURATION_WIZARD_STARTS': 1, + 'PEV_FIRST_USER_EVENT': 1024, + 'PEV_INITIALISATION_PROGRESS_PERCENT': 4, + 'PEV_INITIALISATION_PROGRESS_TASK': 3, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getValue() + # + __az_methods__ = AzureusMethods([ + _method('getType', [], 'int'), + ]) + + +class PluginEventListenerDataType: + def get_xml_type(): + return "PluginEventListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('handleEvent', ['PluginEvent']), + ]) + + +class PluginInterfaceDataType: + def get_xml_type(): + return "PluginInterface" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void addView(PluginView) + # PluginInterface getLocalPluginInterface(Class, String) + # ClassLoader getPluginClassLoader() + # Properties getPluginProperties() + # + __az_methods__ = AzureusMethods([ + _method('addColumnToMyTorrentsTable', ['String', 'PluginMyTorrentsItemFactory']), + _method('addColumnToPeersTable', ['String', 'PluginPeerItemFactory']), + _method('addConfigSection', ['ConfigSection']), + _method('addConfigUIParameters', ['Parameter[]', 'String']), + _method('addEventListener', ['PluginEventListener']), + _method('addListener', ['PluginListener']), + _method('firePluginEvent', ['PluginEvent']), + _method('getAzureusName', [], 'String'), + _method('getAzureusVersion', [], 'String'), + _method('getClientIDManager', [], 'ClientIDManager'), + _method('getConnectionManager', [], 'ConnectionManager'), + _method('getDistributedDatabase', [], 'DistributedDatabase'), + _method('getDownloadManager', [], 'DownloadManager'), + _method('getIPC', [], 'IPCInterface'), + _method('getIPFilter', [], 'IPFilter'), + _method('getLogger', [], 'Logger'), + _method('getMessageManager', [], 'MessageManager'), + _method('getPeerProtocolManager', [], 'PeerProtocolManager'), + _method('getPlatformManager', [], 'PlatformManager'), + _method('getPlugin', [], 'Plugin'), + _method('getPluginconfig', [], 'PluginConfig'), + _method('getPluginConfigUIFactory', [], 'PluginConfigUIFactory'), + _method('getPluginDirectoryName', [], 'String'), + _method('getPluginID', [], 'String'), + _method('getPluginManager', [], 'PluginManager'), + _method('getPluginName', [], 'String'), + _method('getPluginVersion', [], 'String'), + _method('getShareManager', [], 'ShareManager'), + _method('getShortCuts', [], 'ShortCuts'), + _method('getTorrentManager', [], 'TorrentManager'), + _method('getTracker', [], 'Tracker'), + _method('getUIManager', [], 'UIManager'), + _method('getUpdateManager', [], 'UpdateManager'), + _method('getUtilities', [], 'Utilities'), + _method('isBuiltIn', [], 'boolean'), + _method('isDisabled', [], 'boolean'), + _method('isMandatory', [], 'boolean'), + _method('isOperational', [], 'boolean'), + _method('isUnloadable', [], 'boolean'), + _method('openTorrentFile', ['String']), + _method('openTorrentURL', ['String']), + _method('reload'), + _method('removeConfigSection', ['ConfigSection']), + _method('removeEventListener', ['PluginEventListener']), + _method('removeListener', ['PluginListener']), + _method('setDisabled', ['boolean']), + _method('uninstall'), + _method('unload'), + ]) + + __az_attributes__ = { + 'azureus_name': 'String', + 'azureus_version': 'String', + 'plugin_id': 'String', + 'plugin_name': 'String', + } + + +class PluginListenerDataType: + def get_xml_type(): + return "PluginListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('closedownComplete'), + _method('closedownInitiated'), + _method('initializationComplete'), + ]) + + +class PluginManagerDataType: + def get_xml_type(): + return "PluginManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PR_MULTI_INSTANCE': "MULTI_INSTANCE", + 'UI_NONE': 0, + 'UI_SWT': 1, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # boolean equals(Object) + # Class getClass() + # PluginInterface getPluginInterfaceByClass(Class) + # void registerPlugin(Class) + # PluginManager startAzureus(int, Properties) + # + __az_methods__ = AzureusMethods([ + _method('firePluginEvent', ['int']), + _method('getDefaultPluginInterface', [], 'PluginInterface'), + _method('getDefaults', [], 'PluginManagerDefaults'), + _method('getPluginInstaller', [], 'PluginInstaller'), + _method('getPluginInterfaceByClass', ['String'], 'PluginInterface'), + _method('getPluginInterfaceByID', ['String'], 'PluginInterface'), + _method('getPluginInterfaces', [], 'PluginInterface[]'), + _method('getPlugins', [], 'PluginInterface[]'), + _method('hashCode', [], 'int'), + _method('notify'), + _method('notifyAll'), + _method('refreshPluginList'), + _method('registerPlugin', ['Plugin', 'String']), + _method('restartAzureus'), + _method('stopAzureus'), + _method('toString', [], 'String'), + _method('wait', ['long', 'int']), + _method('wait'), + _method('wait', ['long']), + ]) + + +class PluginManagerArgumentHandlerDataType: + def get_xml_type(): + return "PluginManagerArgumentHandler" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('processArguments', ['String[]']), + ]) + + +class PluginManagerDefaultsDataType: + def get_xml_type(): + return "PluginManagerDefaults" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PID_CLIENT_ID': "Client ID", + 'PID_CORE_PATCH_CHECKER': "Core Patch Checker", + 'PID_CORE_UPDATE_CHECKER': "Core Update Checker", + 'PID_DEFAULT_TRACKER_WEB': "Default Tracker Web", + 'PID_DHT': "DHT", + 'PID_DHT_TRACKER': "DHT Tracker", + 'PID_EXTERNAL_SEED': "External Seed", + 'PID_JPC': "JPC", + 'PID_LOCAL_TRACKER': "Local Tracker", + 'PID_MAGNET': "Magnet URI Handler", + 'PID_PLATFORM_CHECKER': "Platform Checker", + 'PID_PLUGIN_UPDATE_CHECKER': "Plugin Update Checker", + 'PID_REMOVE_RULES': "Torrent Removal Rules", + 'PID_SHARE_HOSTER': "Share Hoster", + 'PID_START_STOP_RULES': "Start/Stop Rules", + 'PID_UPNP': "UPnP", + 'PLUGIN_IDS': [ + "Start/Stop Rules", + "Torrent Removal Rules", + "Share Hoster", + "Default Tracker Web", + "Core Update Checker", + "Core Patch Checker", + "Platform Checker", + "UPnP", + "Client ID", + "DHT", + "DHT Tracker", + "Magnet URI Handler", + "JPC", + "External Seed", + "Local Tracker", + ], + } + + __az_methods__ = AzureusMethods([ + _method('getApplicationEntryPoint', [], 'String'), + _method('getApplicationIdentifier', [], 'String'), + _method('getApplicationName', [], 'String'), + _method('getDefaultPlugins', [], 'String[]'), + _method('isDefaultPluginEnabled', ['String'], 'boolean'), + _method('setApplicationEntryPoint', ['String']), + _method('setApplicationIdentifier', ['String']), + _method('setApplicationName', ['String']), + _method('setDefaultPluginEnabled', ['String', 'boolean']), + _method('setSingleInstanceHandler', ['int', 'PluginManagerArgumentHandler']), + ]) + + +class UnloadablePluginDataType: + def get_xml_type(): + return "UnloadablePlugin" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('initialize', ['PluginInterface']), + _method('unload'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.clientid +# +#------------------------------------------------------------------------------ + +class ClientIDGeneratorDataType: + def get_xml_type(): + return "ClientIDGenerator" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PR_URL': "URL", + 'PR_USER_AGENT': "User-Agent", + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void generateHTTPProperties(Properties) + # + __az_methods__ = AzureusMethods([ + _method('filterHTTP', ['String[]'], 'String[]'), + _method('generatePeerID', ['Torrent', 'boolean'], 'byte[]'), + ]) + + +class ClientIDManagerDataType: + def get_xml_type(): + return "ClientIDManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getGenerator', [], 'ClientIDGenerator'), + _method('setGenerator', ['ClientIDGenerator', 'boolean']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.config +# +#------------------------------------------------------------------------------ + +class ConfigParameterDataType: + def get_xml_type(): + return "ConfigParameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + ]) + + +class ConfigParameterListenerDataType: + def get_xml_type(): + return "ConfigParameterListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('configParameterChanged', ['ConfigParameter']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ddb +# +#------------------------------------------------------------------------------ + +class DistributedDatabaseDataType: + def get_xml_type(): + return "DistributedDatabase" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'OP_EXHAUSTIVE_READ': 1, + 'OP_NONE': 0, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # DistributedDatabaseKey createKey(Object) + # DistributedDatabaseKey createKey(Object, String) + # DistributedDatabaseValue createValue(Object) + # DistributedDatabaseContact importContact(InetSocketAddress) + # + __az_methods__ = AzureusMethods([ + _method('addTransferHandler', ['DistributedDatabaseTransferType', 'DistributedDatabaseTransferHandler']), + _method('delete', ['DistributedDatabaseListener', 'DistributedDatabaseKey']), + _method('getStandardTransferType', ['int'], 'DistributedDatabaseTransferType'), + _method('isAvailable', [], 'boolean'), + _method('isExtendedUseAllowed', [], 'boolean'), + _method('read', ['DistributedDatabaseListener', 'DistributedDatabaseKey', 'long']), + _method('read', ['DistributedDatabaseListener', 'DistributedDatabaseKey', 'long', 'int']), + _method('write', ['DistributedDatabaseListener', 'DistributedDatabaseKey', 'DistributedDatabaseValue[]']), + _method('write', ['DistributedDatabaseListener', 'DistributedDatabaseKey', 'DistributedDatabaseValue']), + ]) + + +class DistributedDatabaseContactDataType: + def get_xml_type(): + return "DistributedDatabaseContact" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # InetSocketAddress getAddress() + # + __az_methods__ = AzureusMethods([ + _method('getName', [], 'String'), + _method('isAlive', ['long'], 'boolean'), + _method('isOrHasBeenLocal', [], 'boolean'), + _method('openTunnel', [], 'boolean'), + _method('read', + ['DistributedDatabaseProgressListener', 'DistributedDatabaseTransferType', 'DistributedDatabaseKey', + 'long'], 'DistributedDatabaseValue'), + _method('write', ['DistributedDatabaseTransferType', 'DistributedDatabaseKey', 'DistributedDatabaseValue']), + ]) + + +class DistributedDatabaseEventDataType: + def get_xml_type(): + return "DistributedDatabaseEvent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ET_OPERATION_COMPLETE': 4, + 'ET_OPERATION_TIMEOUT': 5, + 'ET_VALUE_DELETED': 3, + 'ET_VALUE_READ': 2, + 'ET_VALUE_WRITTEN': 1, + } + + __az_methods__ = AzureusMethods([ + _method('getContact', [], 'DistributedDatabaseContact'), + _method('getKey', [], 'DistributedDatabaseKey'), + _method('getType', [], 'int'), + _method('getValue', [], 'DistributedDatabaseValue'), + ]) + + +class DistributedDatabaseKeyDataType: + def get_xml_type(): + return "DistributedDatabaseKey" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getKey() + # + __az_methods__ = AzureusMethods([ + _method('getDescription', [], 'String'), + ]) + + +class DistributedDatabaseListenerDataType: + def get_xml_type(): + return "DistributedDatabaseListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('event', ['DistributedDatabaseEvent']), + ]) + + +class DistributedDatabaseProgressListenerDataType: + def get_xml_type(): + return "DistributedDatabaseProgressListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('reportActivity', ['String']), + _method('reportCompleteness', ['int']), + _method('reportSize', ['long']), + ]) + + +class DistributedDatabaseTransferHandlerDataType: + def get_xml_type(): + return "DistributedDatabaseTransferHandler" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('read', ['DistributedDatabaseContact', 'DistributedDatabaseTransferType', 'DistributedDatabaseKey'], + 'DistributedDatabaseValue'), + _method('write', ['DistributedDatabaseContact', 'DistributedDatabaseTransferType', 'DistributedDatabaseKey', + 'DistributedDatabaseValue']), + ]) + + +class DistributedDatabaseTransferTypeDataType: + def get_xml_type(): + return "DistributedDatabaseTransferType" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ST_TORRENT': 1, + } + + +class DistributedDatabaseValueDataType: + def get_xml_type(): + return "DistributedDatabaseValue" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getValue(Class) + # + __az_methods__ = AzureusMethods([ + _method('getContact', [], 'DistributedDatabaseContact'), + _method('getCreationTime', [], 'long'), + _method('getVersion', [], 'long'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.disk +# +#------------------------------------------------------------------------------ + +class DiskManagerDataType: + def get_xml_type(): + return "DiskManager" + + get_xml_type = staticmethod(get_xml_type) + + +class DiskManagerChannelDataType: + def get_xml_type(): + return "DiskManagerChannel" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('createRequest', [], 'DiskManagerRequest'), + _method('destroy'), + ]) + + +class DiskManagerEventDataType: + def get_xml_type(): + return "DiskManagerEvent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'EVENT_TYPE_BLOCKED': 3, + 'EVENT_TYPE_FAILED': 2, + 'EVENT_TYPE_SUCCESS': 1, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Throwable getFailure() + # + __az_methods__ = AzureusMethods([ + _method('getBuffer', [], 'PooledByteBuffer'), + _method('getLength', [], 'int'), + _method('getOffset', [], 'long'), + _method('getRequest', [], 'DiskManagerRequest'), + _method('getType', [], 'int'), + ]) + + +class DiskManagerFileInfoDataType: + def get_xml_type(): + return "DiskManagerFileInfo" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'READ': 1, + 'WRITE': 2, + 'PRIORITY_HIGH': 1, + 'PRIORITY_LOW': -1, + 'PRIORITY_NORMAL': 0 + } + + __az_methods__ = AzureusMethods([ + _method('createChannel', [], 'DiskManagerChannel'), + _method('getAccessMode', [], 'int'), + _method('getDownload', [], 'Download'), + _method('getDownloaded', [], 'long'), + _method('getFile', [], 'File'), + _method('getFirstPieceNumber', [], 'int'), + _method('getIndex', [], 'int'), + _method('getLength', [], 'long'), + _method('getLink', [], 'File'), + _method('getNumPieces', [], 'int'), + _method('getNumericPriority', [], 'int'), + _method('isDeleted', [], 'boolean'), + _method('isPriority', [], 'boolean'), + _method('isSkipped', [], 'boolean'), + _method('setDeleted', ['boolean']), + _method('setLink', ['File']), + _method('setNumericPriority', ['int']), + _method('setPriority', ['boolean']), + _method('setSkipped', ['boolean']), + ]) + + __az_attributes__ = { + 'access_mode': 'int', + 'downloaded': 'long', + 'file': 'File', + 'first_piece_number': 'int', + 'is_priority': 'boolean', + 'is_skipped': 'boolean', + 'num_pieces': 'int', + } + + +class DiskManagerListenerDataType: + def get_xml_type(): + return "DiskManagerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('eventOccurred', ['DiskManagerEvent']), + ]) + + +class DiskManagerRequestDataType: + def get_xml_type(): + return "DiskManagerRequest" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'REQUEST_READ': 1, + } + + __az_methods__ = AzureusMethods([ + _method('addListener', ['DiskManagerListener']), + _method('cancel'), + _method('removeListener', ['DiskManagerListener']), + _method('run'), + _method('setLength', ['long']), + _method('setOffset', ['long']), + _method('setType', ['int']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.download +# +#------------------------------------------------------------------------------ + +class DownloadDataType: + def get_xml_type(): + return "Download" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'FLAG_ONLY_EVER_SEEDED': 1, + 'FLAG_SCAN_INCOMPLETE_PIECES': 2, + 'PR_HIGH_PRIORITY': 1, + 'PR_LOW_PRIORITY': 2, + 'ST_DOWNLOADING': 4, + 'ST_ERROR': 8, + 'ST_NAMES': [ + "", + "Waiting", + "Preparing", + "Ready", + "Downloading", + "Seeding", + "Stopping", + "Stopped", + "Error", + "Queued", + ], + 'ST_PREPARING': 2, + 'ST_QUEUED': 9, + 'ST_READY': 3, + 'ST_SEEDING': 5, + 'ST_STOPPED': 7, + 'ST_STOPPING': 6, + 'ST_WAITING': 1, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Map getMapAttribute(TorrentAttribute) + # void setMapAttribute(TorrentAttribute, Map) + # + __az_methods__ = AzureusMethods([ + _method('addDownloadWillBeRemovedListener', ['DownloadWillBeRemovedListener']), + _method('addListener', ['DownloadListener']), + _method('addPeerListener', ['DownloadPeerListener']), + _method('addPropertyListener', ['DownloadPropertyListener']), + _method('addTrackerListener', ['DownloadTrackerListener']), + _method('canBeRemoved', [], 'boolean'), + _method('getAttribute', ['TorrentAttribute'], 'String'), + _method('getCategoryName', [], 'String'), + _method('getCreationTime', [], 'long'), + _method('getDiskManager', [], 'DiskManager'), + _method('getSaveLocationManager', [], 'SaveLocationManager'), + _method('getDiskManagerFileInfo', [], 'DiskManagerFileInfo[]'), + _method('getDownloadPeerId', [], 'byte[]'), + _method('getErrorStateDetails', [], 'String'), + _method('getFlag', ['long'], 'boolean'), + _method('getIndex', [], 'int'), + _method('getLastAnnounceResult', [], 'DownloadAnnounceResult'), + _method('getLastScrapeResult', [], 'DownloadScrapeResult'), + _method('getListAttribute', ['TorrentAttribute'], 'String[]'), + _method('getMaximumDownloadKBPerSecond', [], 'int'), + _method('getName', [], 'String'), + _method('getPeerManager', [], 'PeerManager'), + _method('getPosition', [], 'int'), + _method('getPriority', [], 'int'), + _method('getSavePath', [], 'String'), + _method('getSeedingRank', [], 'int'), + _method('getState', [], 'int'), + _method('getStats', [], 'DownloadStats'), + _method('getSubState', [], 'int'), + _method('getTorrent', [], 'Torrent'), + _method('getTorrentFileName', [], 'String'), + _method('getUploadRateLimitBytesPerSecond', [], 'int'), + _method('initialize'), + _method('isChecking', [], 'boolean'), + _method('isComplete', [], 'boolean'), + _method('isCompleteExcludingDND', [], 'boolean'), + _method('isForceStart', [], 'boolean'), + _method('isMessagingEnabled', [], 'boolean'), + _method('isPaused', [], 'boolean'), + _method('isPersistent', [], 'boolean'), + _method('isPriorityLocked', [], 'boolean'), + _method('isStartStopLocked', [], 'boolean'), + _method('moveDataFiles', ['File']), + _method('moveDown'), + _method('moveTo', ['int']), + _method('moveTorrentFile', ['File']), + _method('moveUp'), + _method('recheckData'), + _method('remove'), + _method('remove', ['boolean', 'boolean']), + _method('removeDownloadWillBeRemovedListener', ['DownloadWillBeRemovedListener']), + _method('removeListener', ['DownloadListener']), + _method('removePeerListener', ['DownloadPeerListener']), + _method('removePropertyListener', ['DownloadPropertyListener']), + _method('removeTrackerListener', ['DownloadTrackerListener']), + _method('requestTrackerAnnounce'), + _method('requestTrackerAnnounce', ['boolean']), + _method('requestTrackerScrape', ['boolean']), + _method('restart'), + _method('setAnnounceResult', ['DownloadAnnounceResult']), + _method('setAttribute', ['TorrentAttribute', 'String']), + _method('setCategory', ['String']), + _method('setForceStart', ['boolean']), + _method('setMaximumDownloadKBPerSecond', ['int']), + _method('setMessagingEnabled', ['boolean']), + _method('setPosition', ['int']), + _method('setPriority', ['int']), + _method('setScrapeResult', ['DownloadScrapeResult']), + _method('setSeedingRank', ['int']), + _method('setSessionAuthenticator', ['SessionAuthenticator']), + _method('setUploadRateLimitBytesPerSecond', ['int']), + _method('start'), + _method('stop'), + _method('startDownload'), + _method('stopDownload'), + _method('stopAndQueue'), + ]) + + __az_attributes__ = { + 'announce_result': 'DownloadAnnounceResult', + 'force_start': 'boolean', + 'position': 'int', + 'scrape_result': 'DownloadScrapeResult', + 'stats': 'DownloadStats', + 'torrent': 'Torrent', + } + + +class DownloadAnnounceResultDataType: + def get_xml_type(): + return "DownloadAnnounceResult" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'RT_ERROR': 2, + 'RT_SUCCESS': 1, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Map getExtensions() + # + __az_methods__ = AzureusMethods([ + _method('getDownload', [], 'Download'), + _method('getError', [], 'String'), + _method('getNonSeedCount', [], 'int'), + _method('getPeers', [], 'DownloadAnnounceResultPeer[]'), + _method('getReportedPeerCount', [], 'int'), + _method('getResponseType', [], 'int'), + _method('getSeedCount', [], 'int'), + _method('getTimeToWait', [], 'long'), + _method('getURL', [], 'URL'), + ]) + + __az_attributes__ = { + 'non_seed_count': 'int', + 'seed_count': 'int', + } + + +class DownloadAnnounceResultPeerDataType: + def get_xml_type(): + return "DownloadAnnounceResultPeer" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PROTOCOL_CRYPT': 2, + 'PROTOCOL_NORMAL': 1, + } + + __az_methods__ = AzureusMethods([ + _method('getAddress', [], 'String'), + _method('getPeerID', [], 'byte[]'), + _method('getPort', [], 'int'), + _method('getProtocol', [], 'short'), + _method('getSource', [], 'String'), + ]) + + +class DownloadListenerDataType: + def get_xml_type(): + return "DownloadListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('positionChanged', ['Download', 'int', 'int']), + _method('stateChanged', ['Download', 'int', 'int']), + ]) + + +class DownloadManagerDataType: + def get_xml_type(): + return "DownloadManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addDownload', ['Torrent', 'File', 'File'], 'Download'), + _method('addDownload', ['URL', 'URL']), + _method('addDownload', ['Torrent'], 'Download'), + _method('addDownload', ['URL']), + _method('addDownload', ['File']), + _method('addDownloadWillBeAddedListener', ['DownloadWillBeAddedListener']), + _method('addListener', ['DownloadManagerListener']), + _method('addNonPersistentDownload', ['Torrent', 'File', 'File'], 'Download'), + _method('getDownload', ['byte[]'], 'Download'), + _method('getDownload', ['Torrent'], 'Download'), + _method('getDownloads', [], 'Download[]'), + _method('getDownloads', ['boolean'], 'Download[]'), + _method('getStats', [], 'DownloadManagerStats'), + _method('isSeedingOnly', [], 'boolean'), + _method('pauseDownloads'), + _method('removeDownloadWillBeAddedListener', ['DownloadWillBeAddedListener']), + _method('removeListener', ['DownloadManagerListener']), + _method('resumeDownloads'), + _method('startAllDownloads'), + _method('stopAllDownloads'), + ]) + + +class DownloadManagerListenerDataType: + def get_xml_type(): + return "DownloadManagerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('downloadAdded', ['Download']), + _method('downloadRemoved', ['Download']), + ]) + + +class DownloadManagerStatsDataType: + def get_xml_type(): + return "DownloadManagerStats" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getDataBytesReceived', [], 'long'), + _method('getDataBytesSent', [], 'long'), + _method('getDataReceiveRate', [], 'int'), + _method('getDataSendRate', [], 'int'), + _method('getOverallDataBytesReceived', [], 'long'), + _method('getOverallDataBytesSent', [], 'long'), + _method('getProtocolBytesReceived', [], 'long'), + _method('getProtocolBytesSent', [], 'long'), + _method('getProtocolReceiveRate', [], 'int'), + _method('getProtocolSendRate', [], 'int'), + _method('getSessionUptimeSeconds', [], 'long'), + ]) + + +class DownloadPeerListenerDataType: + def get_xml_type(): + return "DownloadPeerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('peerManagerAdded', ['Download', 'PeerManager']), + _method('peerManagerRemoved', ['Download', 'PeerManager']), + ]) + + +class DownloadPropertyEventDataType: + def get_xml_type(): + return "DownloadPropertyEvent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PT_TORRENT_ATTRIBUTE_WILL_BE_READ': 2, + 'PT_TORRENT_ATTRIBUTE_WRITTEN': 1, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getData() + # + __az_methods__ = AzureusMethods([ + _method('getType', [], 'int'), + ]) + + +class DownloadPropertyListenerDataType: + def get_xml_type(): + return "DownloadPropertyListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('propertyChanged', ['Download', 'DownloadPropertyEvent']), + ]) + + +class DownloadScrapeResultDataType: + def get_xml_type(): + return "DownloadScrapeResult" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'RT_ERROR': 2, + 'RT_SUCCESS': 1, + } + + __az_methods__ = AzureusMethods([ + _method('getDownload', [], 'Download'), + _method('getNextScrapeStartTime', [], 'long'), + _method('getNonSeedCount', [], 'int'), + _method('getResponseType', [], 'int'), + _method('getScrapeStartTime', [], 'long'), + _method('getSeedCount', [], 'int'), + _method('getStatus', [], 'String'), + _method('getURL', [], 'URL'), + _method('setNextScrapeStartTime', ['long']), + ]) + + __az_attributes__ = { + 'non_seed_count': 'int', + 'seed_count': 'int', + } + + +class DownloadStatsDataType: + def get_xml_type(): + return "DownloadStats" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'HEALTH_ERROR': 6, + 'HEALTH_KO': 5, + 'HEALTH_NO_REMOTE': 3, + 'HEALTH_NO_TRACKER': 2, + 'HEALTH_OK': 4, + 'HEALTH_STOPPED': 1, + } + + __az_methods__ = AzureusMethods([ + _method('getAvailability', [], 'float'), + _method('getCompleted', [], 'int'), + _method('getDiscarded', [], 'long'), + _method('getDownloadAverage', [], 'long'), + _method('getDownloadCompleted', ['boolean'], 'int'), + _method('getDownloadDirectory', [], 'String'), + _method('getDownloaded', [], 'long'), + _method('getElapsedTime', [], 'String'), + _method('getETA', [], 'String'), + _method('getHashFails', [], 'long'), + _method('getHealth', [], 'int'), + _method('getSecondsDownloading', [], 'long'), + _method('getSecondsOnlySeeding', [], 'long'), + _method('getShareRatio', [], 'int'), + _method('getStatus', ['boolean'], 'String'), + _method('getStatus', [], 'String'), + _method('getTargetFileOrDir', [], 'String'), + _method('getTimeStarted', [], 'long'), + _method('getTimeStartedSeeding', [], 'long'), + _method('getTotalAverage', [], 'long'), + _method('getTrackerStatus', [], 'String'), + _method('getUploadAverage', [], 'long'), + _method('getUploaded', [], 'long'), + ]) + + __az_attributes__ = { + 'availability': 'float', + 'completed': 'int', + 'download_average': 'long', + 'downloadCompletedLive': 'int', + 'downloadCompletedStored': 'int', + 'downloaded': 'long', + 'eta': 'String', + 'health': 'int', + 'share_ratio': 'int', + 'status': 'String', + 'status_localised': 'String', + 'upload_average': 'long', + 'uploaded': 'long', + } + + +class DownloadTrackerListenerDataType: + def get_xml_type(): + return "DownloadTrackerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('announceResult', ['DownloadAnnounceResult']), + _method('scrapeResult', ['DownloadScrapeResult']), + ]) + + +class DownloadWillBeAddedListenerDataType: + def get_xml_type(): + return "DownloadWillBeAddedListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('initialised', ['Download']), + ]) + + +class DownloadWillBeRemovedListenerDataType: + def get_xml_type(): + return "DownloadWillBeRemovedListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('downloadWillBeRemoved', ['Download']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.download.session +# +#------------------------------------------------------------------------------ + +class SessionAuthenticatorDataType: + def get_xml_type(): + return "SessionAuthenticator" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Map createSessionSyn(Peer) + # void verifySessionAck(Peer, Map) + # Map verifySessionSyn(Peer, Map) + # + __az_methods__ = AzureusMethods([ + _method('decodeSessionData', ['Peer', 'PooledByteBuffer'], 'PooledByteBuffer'), + _method('encodeSessionData', ['Peer', 'PooledByteBuffer'], 'PooledByteBuffer'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.installer +# +#------------------------------------------------------------------------------ + +class FilePluginInstallerDataType: + def get_xml_type(): + return "FilePluginInstaller" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getAlreadyInstalledPlugin', [], 'PluginInterface'), + _method('getDescription', [], 'String'), + _method('getFile', [], 'File'), + _method('getId', [], 'String'), + _method('getInstaller', [], 'PluginInstaller'), + _method('getName', [], 'String'), + _method('getVersion', [], 'String'), + _method('install', ['boolean']), + _method('uninstall'), + ]) + + +class InstallablePluginDataType: + def get_xml_type(): + return "InstallablePlugin" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getAlreadyInstalledPlugin', [], 'PluginInterface'), + _method('getDescription', [], 'String'), + _method('getId', [], 'String'), + _method('getInstaller', [], 'PluginInstaller'), + _method('getName', [], 'String'), + _method('getVersion', [], 'String'), + _method('install', ['boolean']), + _method('uninstall'), + ]) + + +class PluginInstallerDataType: + def get_xml_type(): + return "PluginInstaller" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addListener', ['PluginInstallerListener']), + _method('getStandardPlugins', [], 'StandardPlugin[]'), + _method('install', ['InstallablePlugin[]', 'boolean']), + _method('installFromFile', ['File'], 'FilePluginInstaller'), + _method('removeListener', ['PluginInstallerListener']), + _method('requestInstall', ['String', 'InstallablePlugin']), + _method('uninstall', ['PluginInterface[]']), + _method('uninstall', ['PluginInterface']), + ]) + + +class PluginInstallerListenerDataType: + def get_xml_type(): + return "PluginInstallerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('installRequest', ['String', 'InstallablePlugin'], 'boolean'), + ]) + + +class StandardPluginDataType: + def get_xml_type(): + return "StandardPlugin" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getAlreadyInstalledPlugin', [], 'PluginInterface'), + _method('getDescription', [], 'String'), + _method('getId', [], 'String'), + _method('getInstaller', [], 'PluginInstaller'), + _method('getName', [], 'String'), + _method('getVersion', [], 'String'), + _method('install', ['boolean']), + _method('uninstall'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ipc +# +#------------------------------------------------------------------------------ + +class IPCInterfaceDataType: + def get_xml_type(): + return "IPCInterface" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object invoke(String, Object[]) + # + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ipfilter +# +#------------------------------------------------------------------------------ + +class IPBlockedDataType: + def get_xml_type(): + return "IPBlocked" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getBlockedIP', [], 'String'), + _method('getBlockedTime', [], 'long'), + _method('getBlockedTorrentName', [], 'String'), + _method('getBlockingRange', [], 'IPRange'), + ]) + + +class IPFilterDataType: + def get_xml_type(): + return "IPFilter" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addRange', ['IPRange']), + _method('block', ['String']), + _method('createAndAddRange', ['String', 'String', 'String', 'boolean'], 'IPRange'), + _method('createRange', ['boolean'], 'IPRange'), + _method('getBlockedIPs', [], 'IPBlocked[]'), + _method('getFile', [], 'File'), + _method('getInRangeAddressesAreAllowed', [], 'boolean'), + _method('getLastUpdateTime', [], 'long'), + _method('getNumberOfBlockedIPs', [], 'int'), + _method('getNumberOfRanges', [], 'int'), + _method('getRanges', [], 'IPRange[]'), + _method('isEnabled', [], 'boolean'), + _method('isInRange', ['String'], 'boolean'), + _method('markAsUpToDate'), + _method('reload'), + _method('removeRange', ['IPRange']), + _method('save'), + _method('setEnabled', ['boolean']), + _method('setInRangeAddressesAreAllowed', ['boolean']), + ]) + + __az_attributes__ = { + 'last_update_time': 'long', + 'number_of_blocked_ips': 'int', + 'number_of_ranges': 'int', + } + + +class IPRangeDataType: + def get_xml_type(): + return "IPRange" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # int compareTo(Object) + # + __az_methods__ = AzureusMethods([ + _method('checkValid'), + _method('delete'), + _method('getDescription', [], 'String'), + _method('getEndIP', [], 'String'), + _method('getStartIP', [], 'String'), + _method('isInRange', ['String'], 'boolean'), + _method('isSessionOnly', [], 'boolean'), + _method('isValid', [], 'boolean'), + _method('setDescription', ['String']), + _method('setEndIP', ['String']), + _method('setSessionOnly', ['boolean']), + _method('setStartIP', ['String']), + ]) + + __az_attributes__ = { + 'description': 'String', + 'end_ip': 'String', + 'start_ip': 'String', + } + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.logging +# +#------------------------------------------------------------------------------ + +class LoggerDataType: + def get_xml_type(): + return "Logger" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void addFileLoggingListener(FileLoggerAdapter) + # void removeFileLoggingListener(FileLoggerAdapter) + # + __az_methods__ = AzureusMethods([ + _method('addAlertListener', ['LoggerAlertListener']), + _method('getChannel', ['String'], 'LoggerChannel'), + _method('getChannels', [], 'LoggerChannel[]'), + _method('getNullChannel', ['String'], 'LoggerChannel'), + _method('getPluginInterface', [], 'PluginInterface'), + _method('getTimeStampedChannel', ['String'], 'LoggerChannel'), + _method('removeAlertListener', ['LoggerAlertListener']), + ]) + + +class LoggerAlertListenerDataType: + def get_xml_type(): + return "LoggerAlertListener" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void alertLogged(String, Throwable, boolean) + # + __az_methods__ = AzureusMethods([ + _method('alertLogged', ['int', 'String', 'boolean']), + ]) + + +class LoggerChannelDataType: + def get_xml_type(): + return "LoggerChannel" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'LT_ERROR': 3, + 'LT_INFORMATION': 1, + 'LT_WARNING': 2, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void log(Object, int, String) + # void log(Object[], int, String) + # void log(String, Throwable) + # void log(Throwable) + # void log(Object[], String, Throwable) + # void log(Object, String, Throwable) + # void logAlert(String, Throwable) + # void logAlertRepeatable(String, Throwable) + # + __az_methods__ = AzureusMethods([ + _method('addListener', ['LoggerChannelListener']), + _method('getLogger', [], 'Logger'), + _method('getName', [], 'String'), + _method('isEnabled', [], 'boolean'), + _method('log', ['String']), + _method('log', ['int', 'String']), + _method('logAlert', ['int', 'String']), + _method('logAlertRepeatable', ['int', 'String']), + _method('removeListener', ['LoggerChannelListener']), + _method('setDiagnostic'), + ]) + + __az_attributes__ = { + 'enabled': 'boolean', + 'name': 'String', + } + + +class LoggerChannelListenerDataType: + def get_xml_type(): + return "LoggerChannelListener" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void messageLogged(String, Throwable) + # + __az_methods__ = AzureusMethods([ + _method('messageLogged', ['int', 'String']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.messaging +# +#------------------------------------------------------------------------------ + +class MessageDataType: + def get_xml_type(): + return "Message" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'TYPE_DATA_PAYLOAD': 1, + 'TYPE_PROTOCOL_PAYLOAD': 0, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Message create(ByteBuffer) + # ByteBuffer[] getPayload() + # + __az_methods__ = AzureusMethods([ + _method('destroy'), + _method('getDescription', [], 'String'), + _method('getID', [], 'String'), + _method('getType', [], 'int'), + ]) + + +class MessageManagerDataType: + def get_xml_type(): + return "MessageManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('cancelCompatiblePeersLocation', ['MessageManagerListener']), + _method('deregisterMessageType', ['Message']), + _method('locateCompatiblePeers', ['PluginInterface', 'Message', 'MessageManagerListener']), + _method('registerMessageType', ['Message']), + ]) + + +class MessageManagerListenerDataType: + def get_xml_type(): + return "MessageManagerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('compatiblePeerFound', ['Download', 'Peer', 'Message']), + _method('peerRemoved', ['Download', 'Peer']), + ]) + + +class MessageStreamDecoderDataType: + def get_xml_type(): + return "MessageStreamDecoder" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # ByteBuffer destroy() + # + __az_methods__ = AzureusMethods([ + _method('getDataBytesDecoded', [], 'int'), + _method('getProtocolBytesDecoded', [], 'int'), + _method('pauseDecoding'), + _method('performStreamDecode', ['Transport', 'int'], 'int'), + _method('removeDecodedMessages', [], 'Message[]'), + _method('resumeDecoding'), + ]) + + +class MessageStreamEncoderDataType: + def get_xml_type(): + return "MessageStreamEncoder" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('encodeMessage', ['Message'], 'RawMessage'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.network +# +#------------------------------------------------------------------------------ + +class ConnectionDataType: + def get_xml_type(): + return "Connection" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('close'), + _method('connect', ['ConnectionListener']), + _method('getIncomingMessageQueue', [], 'IncomingMessageQueue'), + _method('getOutgoingMessageQueue', [], 'OutgoingMessageQueue'), + _method('startMessageProcessing'), + ]) + + +class ConnectionListenerDataType: + def get_xml_type(): + return "ConnectionListener" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void connectFailure(Throwable) + # void exceptionThrown(Throwable) + # + __az_methods__ = AzureusMethods([ + _method('connectStarted'), + _method('connectSuccess'), + ]) + + +class ConnectionManagerDataType: + def get_xml_type(): + return "ConnectionManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'NAT_BAD': 3, + 'NAT_OK': 1, + 'NAT_PROBABLY_OK': 2, + 'NAT_UNKNOWN': 0, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Connection createConnection(InetSocketAddress, MessageStreamEncoder, MessageStreamDecoder) + # + __az_methods__ = AzureusMethods([ + _method('getNATStatus', [], 'int'), + ]) + + +class IncomingMessageQueueDataType: + def get_xml_type(): + return "IncomingMessageQueue" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('deregisterListener', ['IncomingMessageQueueListener']), + _method('getPercentDoneOfCurrentMessage', [], 'int'), + _method('notifyOfExternalReceive', ['Message']), + _method('registerListener', ['IncomingMessageQueueListener']), + _method('setDecoder', ['MessageStreamDecoder']), + ]) + + +class IncomingMessageQueueListenerDataType: + def get_xml_type(): + return "IncomingMessageQueueListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('bytesReceived', ['int']), + _method('messageReceived', ['Message'], 'boolean'), + ]) + + +class OutgoingMessageQueueDataType: + def get_xml_type(): + return "OutgoingMessageQueue" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('deregisterListener', ['OutgoingMessageQueueListener']), + _method('getPercentDoneOfCurrentMessage', [], 'int'), + _method('notifyOfExternalSend', ['Message']), + _method('registerListener', ['OutgoingMessageQueueListener']), + _method('sendMessage', ['Message']), + _method('setEncoder', ['MessageStreamEncoder']), + ]) + + +class OutgoingMessageQueueListenerDataType: + def get_xml_type(): + return "OutgoingMessageQueueListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('bytesSent', ['int']), + _method('messageAdded', ['Message'], 'boolean'), + _method('messageSent', ['Message']), + ]) + + +class RawMessageDataType: + def get_xml_type(): + return "RawMessage" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'TYPE_DATA_PAYLOAD': 1, + 'TYPE_PROTOCOL_PAYLOAD': 0, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Message create(ByteBuffer) + # ByteBuffer[] getPayload() + # ByteBuffer[] getRawPayload() + # + __az_methods__ = AzureusMethods([ + _method('destroy'), + _method('getDescription', [], 'String'), + _method('getID', [], 'String'), + _method('getOriginalMessage', [], 'Message'), + _method('getType', [], 'int'), + ]) + + +class TransportDataType: + def get_xml_type(): + return "Transport" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # long read(ByteBuffer[], int, int) + # long write(ByteBuffer[], int, int) + # + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.peers +# +#------------------------------------------------------------------------------ + +class PeerDataType: + def get_xml_type(): + return "Peer" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'CLOSING': 40, + 'CONNECTING': 10, + 'DISCONNECTED': 50, + 'HANDSHAKING': 20, + 'TRANSFERING': 30, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # List getExpiredRequests() + # Map getProperties() + # List getRequests() + # Object getUserData(Object) + # void setUserData(Object, Object) + # + __az_methods__ = AzureusMethods([ + _method('addListener', ['PeerListener2']), + _method('addListener', ['PeerListener']), + _method('addRequest', ['PeerReadRequest'], 'boolean'), + _method('cancelRequest', ['PeerReadRequest']), + _method('close', ['String', 'boolean', 'boolean']), + _method('getAvailable', [], 'boolean[]'), + _method('getClient', [], 'String'), + _method('getConnection', [], 'Connection'), + _method('getId', [], 'byte[]'), + _method('getIp', [], 'String'), + _method('getManager', [], 'PeerManager'), + _method('getNumberOfRequests', [], 'int'), + _method('getPercentDone', [], 'int'), + _method('getPercentDoneInThousandNotation', [], 'int'), + _method('getPercentDoneOfCurrentIncomingRequest', [], 'int'), + _method('getPercentDoneOfCurrentOutgoingRequest', [], 'int'), + _method('getPort', [], 'int'), + _method('getSnubbedTime', [], 'long'), + _method('getState', [], 'int'), + _method('getStats', [], 'PeerStats'), + _method('getSupportedMessages', [], 'Message[]'), + _method('getTCPListenPort', [], 'int'), + _method('getUDPListenPort', [], 'int'), + _method('isChoked', [], 'boolean'), + _method('isChoking', [], 'boolean'), + _method('isDownloadPossible', [], 'boolean'), + _method('isIncoming', [], 'boolean'), + _method('isInterested', [], 'boolean'), + _method('isInteresting', [], 'boolean'), + _method('isOptimisticUnchoke', [], 'boolean'), + _method('isPieceAvailable', ['int'], 'boolean'), + _method('isSeed', [], 'boolean'), + _method('isSnubbed', [], 'boolean'), + _method('isTransferAvailable', [], 'boolean'), + _method('removeListener', ['PeerListener2']), + _method('removeListener', ['PeerListener']), + _method('setOptimisticUnchoke', ['boolean']), + _method('setSnubbed', ['boolean']), + _method('supportsMessaging', [], 'boolean'), + ]) + + __az_attributes__ = { + 'ip': 'String', + 'port': 'int', + } + + +class PeerEventDataType: + def get_xml_type(): + return "PeerEvent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ET_ADD_AVAILABILITY': 3, + 'ET_BAD_CHUNK': 2, + 'ET_REMOVE_AVAILABILITY': 4, + 'ET_STATE_CHANGED': 1, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getData() + # + __az_methods__ = AzureusMethods([ + _method('getType', [], 'int'), + ]) + + +class PeerListenerDataType: + def get_xml_type(): + return "PeerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('sentBadChunk', ['int', 'int']), + _method('stateChanged', ['int']), + ]) + + +class PeerListener2DataType: + def get_xml_type(): + return "PeerListener2" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('eventOccurred', ['PeerEvent']), + ]) + + +class PeerManagerDataType: + def get_xml_type(): + return "PeerManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addListener', ['PeerManagerListener']), + _method('addPeer', ['String', 'int']), + _method('addPeer', ['Peer']), + _method('addPeer', ['String', 'int', 'boolean']), + _method('createPeerStats', ['Peer'], 'PeerStats'), + _method('getDiskManager', [], 'DiskManager'), + _method('getDownload', [], 'Download'), + _method('getPeers', [], 'Peer[]'), + _method('getStats', [], 'PeerManagerStats'), + _method('isSeeding', [], 'boolean'), + _method('isSuperSeeding', [], 'boolean'), + _method('removeListener', ['PeerManagerListener']), + _method('removePeer', ['Peer']), + _method('requestCancelled', ['PeerReadRequest', 'Peer']), + _method('requestComplete', ['PeerReadRequest', 'PooledByteBuffer', 'Peer']), + ]) + + +class PeerManagerListenerDataType: + def get_xml_type(): + return "PeerManagerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('peerAdded', ['PeerManager', 'Peer']), + _method('peerRemoved', ['PeerManager', 'Peer']), + ]) + + +class PeerManagerStatsDataType: + def get_xml_type(): + return "PeerManagerStats" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getConnectedLeechers', [], 'int'), + _method('getConnectedSeeds', [], 'int'), + _method('getDiscarded', [], 'long'), + _method('getDownloadAverage', [], 'long'), + _method('getDownloaded', [], 'long'), + _method('getHashFailBytes', [], 'long'), + _method('getUploadAverage', [], 'long'), + _method('getUploaded', [], 'long'), + ]) + + +class PeerReadRequestDataType: + def get_xml_type(): + return "PeerReadRequest" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('cancel'), + _method('getLength', [], 'int'), + _method('getOffset', [], 'int'), + _method('getPieceNumber', [], 'int'), + _method('isCancelled', [], 'boolean'), + _method('isExpired', [], 'boolean'), + _method('resetTime', ['long']), + ]) + + +class PeerStatsDataType: + def get_xml_type(): + return "PeerStats" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('discarded', ['int']), + _method('getDownloadAverage', [], 'int'), + _method('getReception', [], 'int'), + _method('getStatisticSentAverage', [], 'int'), + _method('getTimeSinceConnectionEstablished', [], 'long'), + _method('getTotalAverage', [], 'int'), + _method('getTotalDiscarded', [], 'long'), + _method('getTotalReceived', [], 'long'), + _method('getTotalSent', [], 'long'), + _method('getUploadAverage', [], 'int'), + _method('received', ['int']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.peers.protocol +# +#------------------------------------------------------------------------------ + +class PeerProtocolBTDataType: + def get_xml_type(): + return "PeerProtocolBT" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following constants are not defined here, because their types + # are not available in DOPAL: + # + # "BT_BITFIELD" (has type "byte)" + # "BT_CANCEL" (has type "byte)" + # "BT_CHOKED" (has type "byte)" + # "BT_HAVE" (has type "byte)" + # "BT_INTERESTED" (has type "byte)" + # "BT_PIECE" (has type "byte)" + # "BT_REQUEST" (has type "byte)" + # "BT_UNCHOKED" (has type "byte)" + # "BT_UNINTERESTED" (has type "byte)" + # + + +class PeerProtocolExtensionHandlerDataType: + def get_xml_type(): + return "PeerProtocolExtensionHandler" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Peer[] handleExtension(PeerManager, Map) + # + + +class PeerProtocolManagerDataType: + def get_xml_type(): + return "PeerProtocolManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('registerExtensionHandler', ['String', 'PeerProtocolExtensionHandler']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.platform +# +#------------------------------------------------------------------------------ + +class PlatformManagerDataType: + def get_xml_type(): + return "PlatformManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'LOC_MUSIC': 2, + 'LOC_USER_DATA': 1, + } + + __az_methods__ = AzureusMethods([ + _method('getLocation', ['long'], 'File'), + _method('isAdditionalFileTypeRegistered', ['String', 'String'], 'boolean'), + _method('registerAdditionalFileType', ['String', 'String', 'String', 'String']), + _method('showFile', ['String']), + _method('unregisterAdditionalFileType', ['String', 'String']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.sharing +# +#------------------------------------------------------------------------------ + +class ShareItemDataType: + def get_xml_type(): + return "ShareItem" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getTorrent', [], 'Torrent'), + _method('getTorrentFile', [], 'File'), + ]) + + +class ShareManagerDataType: + def get_xml_type(): + return "ShareManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addDir', ['File'], 'ShareResourceDir'), + _method('addDirContents', ['File', 'boolean'], 'ShareResourceDirContents'), + _method('addFile', ['File'], 'ShareResourceFile'), + _method('addListener', ['ShareManagerListener']), + _method('cancelOperation'), + _method('getShare', ['File'], 'ShareResource'), + _method('getShares', [], 'ShareResource[]'), + _method('initialise'), + _method('isInitialising', [], 'boolean'), + _method('removeListener', ['ShareManagerListener']), + ]) + + +class ShareManagerListenerDataType: + def get_xml_type(): + return "ShareManagerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('reportCurrentTask', ['String']), + _method('reportProgress', ['int']), + _method('resourceAdded', ['ShareResource']), + _method('resourceDeleted', ['ShareResource']), + _method('resourceModified', ['ShareResource']), + ]) + + +class ShareResourceDataType: + def get_xml_type(): + return "ShareResource" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ST_DIR': 2, + 'ST_DIR_CONTENTS': 3, + 'ST_FILE': 1, + } + + __az_methods__ = AzureusMethods([ + _method('addChangeListener', ['ShareResourceListener']), + _method('addDeletionListener', ['ShareResourceWillBeDeletedListener']), + _method('canBeDeleted', [], 'boolean'), + _method('delete'), + _method('getAttribute', ['TorrentAttribute'], 'String'), + _method('getAttributes', [], 'TorrentAttribute[]'), + _method('getName', [], 'String'), + _method('getParent', [], 'ShareResourceDirContents'), + _method('getType', [], 'int'), + _method('removeChangeListener', ['ShareResourceListener']), + _method('removeDeletionListener', ['ShareResourceWillBeDeletedListener']), + _method('setAttribute', ['TorrentAttribute', 'String']), + ]) + + +class ShareResourceDirDataType: + def get_xml_type(): + return "ShareResourceDir" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ST_DIR': 2, + 'ST_DIR_CONTENTS': 3, + 'ST_FILE': 1, + } + + __az_methods__ = AzureusMethods([ + _method('addChangeListener', ['ShareResourceListener']), + _method('addDeletionListener', ['ShareResourceWillBeDeletedListener']), + _method('canBeDeleted', [], 'boolean'), + _method('delete'), + _method('getAttribute', ['TorrentAttribute'], 'String'), + _method('getAttributes', [], 'TorrentAttribute[]'), + _method('getDir', [], 'File'), + _method('getItem', [], 'ShareItem'), + _method('getName', [], 'String'), + _method('getParent', [], 'ShareResourceDirContents'), + _method('getType', [], 'int'), + _method('removeChangeListener', ['ShareResourceListener']), + _method('removeDeletionListener', ['ShareResourceWillBeDeletedListener']), + _method('setAttribute', ['TorrentAttribute', 'String']), + ]) + + +class ShareResourceDirContentsDataType: + def get_xml_type(): + return "ShareResourceDirContents" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ST_DIR': 2, + 'ST_DIR_CONTENTS': 3, + 'ST_FILE': 1, + } + + __az_methods__ = AzureusMethods([ + _method('addChangeListener', ['ShareResourceListener']), + _method('addDeletionListener', ['ShareResourceWillBeDeletedListener']), + _method('canBeDeleted', [], 'boolean'), + _method('delete'), + _method('getAttribute', ['TorrentAttribute'], 'String'), + _method('getAttributes', [], 'TorrentAttribute[]'), + _method('getChildren', [], 'ShareResource[]'), + _method('getName', [], 'String'), + _method('getParent', [], 'ShareResourceDirContents'), + _method('getRoot', [], 'File'), + _method('getType', [], 'int'), + _method('isRecursive', [], 'boolean'), + _method('removeChangeListener', ['ShareResourceListener']), + _method('removeDeletionListener', ['ShareResourceWillBeDeletedListener']), + _method('setAttribute', ['TorrentAttribute', 'String']), + ]) + + +class ShareResourceEventDataType: + def get_xml_type(): + return "ShareResourceEvent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ET_ATTRIBUTE_CHANGED': 1, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getData() + # + __az_methods__ = AzureusMethods([ + _method('getType', [], 'int'), + ]) + + +class ShareResourceFileDataType: + def get_xml_type(): + return "ShareResourceFile" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ST_DIR': 2, + 'ST_DIR_CONTENTS': 3, + 'ST_FILE': 1, + } + + __az_methods__ = AzureusMethods([ + _method('addChangeListener', ['ShareResourceListener']), + _method('addDeletionListener', ['ShareResourceWillBeDeletedListener']), + _method('canBeDeleted', [], 'boolean'), + _method('delete'), + _method('getAttribute', ['TorrentAttribute'], 'String'), + _method('getAttributes', [], 'TorrentAttribute[]'), + _method('getFile', [], 'File'), + _method('getItem', [], 'ShareItem'), + _method('getName', [], 'String'), + _method('getParent', [], 'ShareResourceDirContents'), + _method('getType', [], 'int'), + _method('removeChangeListener', ['ShareResourceListener']), + _method('removeDeletionListener', ['ShareResourceWillBeDeletedListener']), + _method('setAttribute', ['TorrentAttribute', 'String']), + ]) + + +class ShareResourceListenerDataType: + def get_xml_type(): + return "ShareResourceListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('shareResourceChanged', ['ShareResource', 'ShareResourceEvent']), + ]) + + +class ShareResourceWillBeDeletedListenerDataType: + def get_xml_type(): + return "ShareResourceWillBeDeletedListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('resourceWillBeDeleted', ['ShareResource']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.torrent +# +#------------------------------------------------------------------------------ + +class TorrentDataType: + def get_xml_type(): + return "Torrent" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getAdditionalProperty(String) + # Map getMapProperty(String) + # byte[][] getPieces() + # void setMapProperty(String, Map) + # Map writeToMap() + # + __az_methods__ = AzureusMethods([ + _method('getAnnounceURL', [], 'URL'), + _method('getAnnounceURLList', [], 'TorrentAnnounceURLList'), + _method('getComment', [], 'String'), + _method('getCreatedBy', [], 'String'), + _method('getCreationDate', [], 'long'), + _method('getEncoding', [], 'String'), + _method('getFiles', [], 'TorrentFile[]'), + _method('getHash', [], 'byte[]'), + _method('getMagnetURI', [], 'URL'), + _method('getName', [], 'String'), + _method('getPieceCount', [], 'long'), + _method('getPieceSize', [], 'long'), + _method('getPluginStringProperty', ['String'], 'String'), + _method('getSize', [], 'long'), + _method('isDecentralised', [], 'boolean'), + _method('isDecentralisedBackupEnabled', [], 'boolean'), + _method('isDecentralisedBackupRequested', [], 'boolean'), + _method('isPrivate', [], 'boolean'), + _method('removeAdditionalProperties', [], 'Torrent'), + _method('save'), + _method('setAnnounceURL', ['URL']), + _method('setComment', ['String']), + _method('setComplete', ['File']), + _method('setDecentralisedBackupRequested', ['boolean']), + _method('setPluginStringProperty', ['String', 'String']), + _method('setPrivate', ['boolean']), + _method('writeToBEncodedData', [], 'byte[]'), + _method('writeToFile', ['File']), + ]) + + __az_attributes__ = { + 'hash': 'byte[]', + 'name': 'String', + 'size': 'long', + } + + +class TorrentAnnounceURLListDataType: + def get_xml_type(): + return "TorrentAnnounceURLList" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addSet', ['URL[]']), + _method('create', ['URL[]'], 'TorrentAnnounceURLListSet'), + _method('getSets', [], 'TorrentAnnounceURLListSet[]'), + _method('insertSetAtFront', ['URL[]']), + _method('setSets', ['TorrentAnnounceURLListSet[]']), + ]) + + +class TorrentAnnounceURLListSetDataType: + def get_xml_type(): + return "TorrentAnnounceURLListSet" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getURLs', [], 'URL[]'), + _method('setURLs', ['URL[]']), + ]) + + +class TorrentAttributeDataType: + def get_xml_type(): + return "TorrentAttribute" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'TA_CATEGORY': "Category", + 'TA_NETWORKS': "Networks", + 'TA_PEER_SOURCES': "PeerSources", + 'TA_SHARE_PROPERTIES': "ShareProperties", + 'TA_TRACKER_CLIENT_EXTENSIONS': "TrackerClientExtensions", + } + + __az_methods__ = AzureusMethods([ + _method('addDefinedValue', ['String']), + _method('addTorrentAttributeListener', ['TorrentAttributeListener']), + _method('getDefinedValues', [], 'String[]'), + _method('getName', [], 'String'), + _method('removeDefinedValue', ['String']), + _method('removeTorrentAttributeListener', ['TorrentAttributeListener']), + ]) + + +class TorrentAttributeEventDataType: + def get_xml_type(): + return "TorrentAttributeEvent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ET_ATTRIBUTE_VALUE_ADDED': 1, + 'ET_ATTRIBUTE_VALUE_REMOVED': 2, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getData() + # + __az_methods__ = AzureusMethods([ + _method('getAttribute', [], 'TorrentAttribute'), + _method('getType', [], 'int'), + ]) + + +class TorrentAttributeListenerDataType: + def get_xml_type(): + return "TorrentAttributeListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('event', ['TorrentAttributeEvent']), + ]) + + +class TorrentDownloaderDataType: + def get_xml_type(): + return "TorrentDownloader" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('download', [], 'Torrent'), + _method('download', ['String'], 'Torrent'), + ]) + + +class TorrentFileDataType: + def get_xml_type(): + return "TorrentFile" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getName', [], 'String'), + _method('getSize', [], 'long'), + ]) + + +class TorrentManagerDataType: + def get_xml_type(): + return "TorrentManager" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Torrent createFromBEncodedInputStream(InputStream) + # + __az_methods__ = AzureusMethods([ + _method('addListener', ['TorrentManagerListener']), + _method('createFromBEncodedData', ['byte[]'], 'Torrent'), + _method('createFromBEncodedFile', ['File'], 'Torrent'), + _method('createFromDataFile', ['File', 'URL', 'boolean'], 'Torrent'), + _method('createFromDataFile', ['File', 'URL'], 'Torrent'), + _method('getAttribute', ['String'], 'TorrentAttribute'), + _method('getDefinedAttributes', [], 'TorrentAttribute[]'), + _method('getPluginAttribute', ['String'], 'TorrentAttribute'), + _method('getURLDownloader', ['URL', 'String', 'String'], 'TorrentDownloader'), + _method('getURLDownloader', ['URL'], 'TorrentDownloader'), + _method('removeListener', ['TorrentManagerListener']), + ]) + + +class TorrentManagerEventDataType: + def get_xml_type(): + return "TorrentManagerEvent" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getData() + # + + +class TorrentManagerListenerDataType: + def get_xml_type(): + return "TorrentManagerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('event', ['TorrentManagerEvent']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.tracker +# +#------------------------------------------------------------------------------ + +class TrackerDataType: + def get_xml_type(): + return "Tracker" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PR_HTTP': 1, + 'PR_HTTPS': 2, + } + + __az_methods__ = AzureusMethods([ + _method('addAuthenticationListener', ['TrackerAuthenticationListener']), + _method('addListener', ['TrackerListener']), + _method('addPageGenerator', ['TrackerWebPageGenerator']), + _method('createWebContext', ['String', 'int', 'int'], 'TrackerWebContext'), + _method('createWebContext', ['int', 'int'], 'TrackerWebContext'), + _method('getName', [], 'String'), + _method('getPageGenerators', [], 'TrackerWebPageGenerator[]'), + _method('getTorrent', ['Torrent'], 'TrackerTorrent'), + _method('getTorrents', [], 'TrackerTorrent[]'), + _method('getURLs', [], 'URL[]'), + _method('host', ['Torrent', 'boolean'], 'TrackerTorrent'), + _method('host', ['Torrent', 'boolean', 'boolean'], 'TrackerTorrent'), + _method('publish', ['Torrent'], 'TrackerTorrent'), + _method('removeAuthenticationListener', ['TrackerAuthenticationListener']), + _method('removeListener', ['TrackerListener']), + _method('removePageGenerator', ['TrackerWebPageGenerator']), + ]) + + +class TrackerListenerDataType: + def get_xml_type(): + return "TrackerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('torrentAdded', ['TrackerTorrent']), + _method('torrentChanged', ['TrackerTorrent']), + _method('torrentRemoved', ['TrackerTorrent']), + ]) + + +class TrackerPeerDataType: + def get_xml_type(): + return "TrackerPeer" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getAmountLeft', [], 'long'), + _method('getDownloaded', [], 'long'), + _method('getIP', [], 'String'), + _method('getIPRaw', [], 'String'), + _method('getUploaded', [], 'long'), + _method('isSeed', [], 'boolean'), + ]) + + +class TrackerPeerEventDataType: + def get_xml_type(): + return "TrackerPeerEvent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ET_PEER_ADDED': 1, + 'ET_PEER_CHANGED': 2, + 'ET_PEER_REMOVED': 3, + } + + __az_methods__ = AzureusMethods([ + _method('getEventType', [], 'int'), + ]) + + +class TrackerPeerListenerDataType: + def get_xml_type(): + return "TrackerPeerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('eventOccurred', ['TrackerPeerEvent']), + ]) + + +class TrackerTorrentDataType: + def get_xml_type(): + return "TrackerTorrent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'TS_PUBLISHED': 2, + 'TS_STARTED': 0, + 'TS_STOPPED': 1, + } + + __az_methods__ = AzureusMethods([ + _method('addListener', ['TrackerTorrentListener']), + _method('addRemovalListener', ['TrackerTorrentWillBeRemovedListener']), + _method('canBeRemoved', [], 'boolean'), + _method('disableReplyCaching'), + _method('getAnnounceCount', [], 'long'), + _method('getAverageAnnounceCount', [], 'long'), + _method('getAverageBytesIn', [], 'long'), + _method('getAverageBytesOut', [], 'long'), + _method('getAverageDownloaded', [], 'long'), + _method('getAverageScrapeCount', [], 'long'), + _method('getAverageUploaded', [], 'long'), + _method('getBadNATCount', [], 'int'), + _method('getCompletedCount', [], 'long'), + _method('getDateAdded', [], 'long'), + _method('getLeecherCount', [], 'int'), + _method('getPeers', [], 'TrackerPeer[]'), + _method('getScrapeCount', [], 'long'), + _method('getSeedCount', [], 'int'), + _method('getStatus', [], 'int'), + _method('getTorrent', [], 'Torrent'), + _method('getTotalBytesIn', [], 'long'), + _method('getTotalBytesOut', [], 'long'), + _method('getTotalDownloaded', [], 'long'), + _method('getTotalLeft', [], 'long'), + _method('getTotalUploaded', [], 'long'), + _method('isPassive', [], 'boolean'), + _method('remove'), + _method('removeListener', ['TrackerTorrentListener']), + _method('removeRemovalListener', ['TrackerTorrentWillBeRemovedListener']), + _method('start'), + _method('stop'), + ]) + + __az_attributes__ = { + 'announce_count': 'long', + 'average_announce_count': 'long', + 'average_bytes_in': 'long', + 'average_bytes_out': 'long', + 'average_downloaded': 'long', + 'average_scrape_count': 'long', + 'average_uploaded': 'long', + 'bad_NAT_count': 'int', + 'completed_count': 'long', + 'leecher_count': 'int', + 'scrape_count': 'long', + 'seed_count': 'int', + 'status': 'int', + 'torrent': 'Torrent', + 'total_bytes_in': 'long', + 'total_bytes_out': 'long', + 'total_downloaded': 'long', + 'total_left': 'long', + 'total_uploaded': 'long', + } + + +class TrackerTorrentListenerDataType: + def get_xml_type(): + return "TrackerTorrentListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('postProcess', ['TrackerTorrentRequest']), + _method('preProcess', ['TrackerTorrentRequest']), + ]) + + +class TrackerTorrentRequestDataType: + def get_xml_type(): + return "TrackerTorrentRequest" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'RT_ANNOUNCE': 1, + 'RT_FULL_SCRAPE': 3, + 'RT_SCRAPE': 2, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Map getResponse() + # + __az_methods__ = AzureusMethods([ + _method('getPeer', [], 'TrackerPeer'), + _method('getRequest', [], 'String'), + _method('getRequestType', [], 'int'), + _method('getTorrent', [], 'TrackerTorrent'), + ]) + + +class TrackerTorrentWillBeRemovedListenerDataType: + def get_xml_type(): + return "TrackerTorrentWillBeRemovedListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('torrentWillBeRemoved', ['TrackerTorrent']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.tracker.web +# +#------------------------------------------------------------------------------ + +class TrackerAuthenticationListenerDataType: + def get_xml_type(): + return "TrackerAuthenticationListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('authenticate', ['URL', 'String', 'String'], 'boolean'), + _method('authenticate', ['URL', 'String'], 'byte[]'), + ]) + + +class TrackerWebContextDataType: + def get_xml_type(): + return "TrackerWebContext" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addAuthenticationListener', ['TrackerAuthenticationListener']), + _method('addPageGenerator', ['TrackerWebPageGenerator']), + _method('getName', [], 'String'), + _method('getPageGenerators', [], 'TrackerWebPageGenerator[]'), + _method('getURLs', [], 'URL[]'), + _method('removeAuthenticationListener', ['TrackerAuthenticationListener']), + _method('removePageGenerator', ['TrackerWebPageGenerator']), + ]) + + +class TrackerWebPageGeneratorDataType: + def get_xml_type(): + return "TrackerWebPageGenerator" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('generate', ['TrackerWebPageRequest', 'TrackerWebPageResponse'], 'boolean'), + ]) + + +class TrackerWebPageRequestDataType: + def get_xml_type(): + return "TrackerWebPageRequest" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # InetSocketAddress getClientAddress2() + # Map getHeaders() + # InputStream getInputStream() + # + __az_methods__ = AzureusMethods([ + _method('getAbsoluteURL', [], 'URL'), + _method('getClientAddress', [], 'String'), + _method('getContext', [], 'TrackerWebContext'), + _method('getHeader', [], 'String'), + _method('getTracker', [], 'Tracker'), + _method('getURL', [], 'String'), + _method('getUser', [], 'String'), + ]) + + +class TrackerWebPageResponseDataType: + def get_xml_type(): + return "TrackerWebPageResponse" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # OutputStream getOutputStream() + # void useStream(String, InputStream) + # + __az_methods__ = AzureusMethods([ + _method('setContentType', ['String']), + _method('setExpires', ['long']), + _method('setHeader', ['String', 'String']), + _method('setLastModified', ['long']), + _method('setReplyStatus', ['int']), + _method('useFile', ['String', 'String'], 'boolean'), + _method('writeTorrent', ['TrackerTorrent']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ui +# +#------------------------------------------------------------------------------ + +class GraphicDataType: + def get_xml_type(): + return "Graphic" + + get_xml_type = staticmethod(get_xml_type) + + +class UIInstanceDataType: + def get_xml_type(): + return "UIInstance" + + get_xml_type = staticmethod(get_xml_type) + + +class UIInstanceFactoryDataType: + def get_xml_type(): + return "UIInstanceFactory" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('detach'), + _method('getInstance', ['PluginInterface'], 'UIInstance'), + ]) + + +class UIManagerDataType: + def get_xml_type(): + return "UIManager" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # PluginView createPluginView(PluginViewModel) + # + __az_methods__ = AzureusMethods([ + _method('addUIEventListener', ['UIManagerEventListener']), + _method('addUIListener', ['UIManagerListener']), + _method('attachUI', ['UIInstanceFactory']), + _method('copyToClipBoard', ['String']), + _method('createBasicPluginConfigModel', ['String'], 'BasicPluginConfigModel'), + _method('createBasicPluginConfigModel', ['String', 'String'], 'BasicPluginConfigModel'), + _method('createBasicPluginViewModel', ['String'], 'BasicPluginViewModel'), + _method('detachUI', ['UIInstanceFactory']), + _method('getBasicPluginViewModel', ['String'], 'BasicPluginViewModel'), + _method('getSWTManager', [], 'SWTManager'), + _method('getTableManager', [], 'TableManager'), + _method('openURL', ['URL']), + _method('removeUIEventListener', ['UIManagerEventListener']), + _method('removeUIListener', ['UIManagerListener']), + _method('showConfigSection', ['String'], 'boolean'), + _method('showTextMessage', ['String', 'String', 'String']), + ]) + + +class UIManagerEventDataType: + def get_xml_type(): + return "UIManagerEvent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ET_ADD_TABLE_COLUMN': 11, + 'ET_ADD_TABLE_CONTEXT_MENU_ITEM': 12, + 'ET_COPY_TO_CLIPBOARD': 6, + 'ET_CREATE_TABLE_COLUMN': 10, + 'ET_OPEN_TORRENT_VIA_FILE': 2, + 'ET_OPEN_TORRENT_VIA_URL': 3, + 'ET_OPEN_URL': 9, + 'ET_PLUGIN_CONFIG_MODEL_CREATED': 5, + 'ET_PLUGIN_CONFIG_MODEL_DESTROYED': 8, + 'ET_PLUGIN_VIEW_MODEL_CREATED': 4, + 'ET_PLUGIN_VIEW_MODEL_DESTROYED': 7, + 'ET_SHOW_CONFIG_SECTION': 13, + 'ET_SHOW_TEXT_MESSAGE': 1, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getData() + # Object getResult() + # void setResult(Object) + # + __az_methods__ = AzureusMethods([ + _method('getType', [], 'int'), + ]) + + +class UIManagerEventListenerDataType: + def get_xml_type(): + return "UIManagerEventListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('eventOccurred', ['UIManagerEvent'], 'boolean'), + ]) + + +class UIManagerListenerDataType: + def get_xml_type(): + return "UIManagerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('UIAttached', ['UIInstance']), + _method('UIDetached', ['UIInstance']), + ]) + + +class UIPluginViewDataType: + def get_xml_type(): + return "UIPluginView" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getDataSource() + # + __az_methods__ = AzureusMethods([ + _method('closeView'), + _method('getViewID', [], 'String'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ui.components +# +#------------------------------------------------------------------------------ + +class UIComponentDataType: + def get_xml_type(): + return "UIComponent" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PT_ENABLED': "enabled", + 'PT_VALUE': "value", + 'PT_VISIBLE': "visible", + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getProperty(String) + # void setProperty(String, Object) + # + __az_methods__ = AzureusMethods([ + _method('addPropertyChangeListener', ['UIPropertyChangeListener']), + _method('getEnabled', [], 'boolean'), + _method('getVisible', [], 'boolean'), + _method('removePropertyChangeListener', ['UIPropertyChangeListener']), + _method('setEnabled', ['boolean']), + _method('setVisible', ['boolean']), + ]) + + +class UIProgressBarDataType: + def get_xml_type(): + return "UIProgressBar" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PT_ENABLED': "enabled", + 'PT_VALUE': "value", + 'PT_VISIBLE': "visible", + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getProperty(String) + # void setProperty(String, Object) + # + __az_methods__ = AzureusMethods([ + _method('addPropertyChangeListener', ['UIPropertyChangeListener']), + _method('getEnabled', [], 'boolean'), + _method('getPercentageComplete', [], 'int'), + _method('getVisible', [], 'boolean'), + _method('removePropertyChangeListener', ['UIPropertyChangeListener']), + _method('setEnabled', ['boolean']), + _method('setPercentageComplete', ['int']), + _method('setVisible', ['boolean']), + ]) + + +class UIPropertyChangeEventDataType: + def get_xml_type(): + return "UIPropertyChangeEvent" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getNewPropertyValue() + # Object getOldPropertyValue() + # + __az_methods__ = AzureusMethods([ + _method('getPropertyType', [], 'String'), + _method('getSource', [], 'UIComponent'), + ]) + + +class UIPropertyChangeListenerDataType: + def get_xml_type(): + return "UIPropertyChangeListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('propertyChanged', ['UIPropertyChangeEvent']), + ]) + + +class UITextAreaDataType: + def get_xml_type(): + return "UITextArea" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'DEFAULT_MAX_SIZE': 60000, + 'PT_ENABLED': "enabled", + 'PT_VALUE': "value", + 'PT_VISIBLE': "visible", + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getProperty(String) + # void setProperty(String, Object) + # + __az_methods__ = AzureusMethods([ + _method('addPropertyChangeListener', ['UIPropertyChangeListener']), + _method('appendText', ['String']), + _method('getEnabled', [], 'boolean'), + _method('getText', [], 'String'), + _method('getVisible', [], 'boolean'), + _method('removePropertyChangeListener', ['UIPropertyChangeListener']), + _method('setEnabled', ['boolean']), + _method('setMaximumSize', ['int']), + _method('setText', ['String']), + _method('setVisible', ['boolean']), + ]) + + +class UITextFieldDataType: + def get_xml_type(): + return "UITextField" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PT_ENABLED': "enabled", + 'PT_VALUE': "value", + 'PT_VISIBLE': "visible", + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getProperty(String) + # void setProperty(String, Object) + # + __az_methods__ = AzureusMethods([ + _method('addPropertyChangeListener', ['UIPropertyChangeListener']), + _method('getEnabled', [], 'boolean'), + _method('getText', [], 'String'), + _method('getVisible', [], 'boolean'), + _method('removePropertyChangeListener', ['UIPropertyChangeListener']), + _method('setEnabled', ['boolean']), + _method('setText', ['String']), + _method('setVisible', ['boolean']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ui.config +# +#------------------------------------------------------------------------------ + +class ActionParameterDataType: + def get_xml_type(): + return "ActionParameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'STYLE_BUTTON': 1, + 'STYLE_LINK': 2, + } + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('addListener', ['ParameterListener']), + _method('getLabelKey', [], 'String'), + _method('getLabelText', [], 'String'), + _method('getStyle', [], 'int'), + _method('isEnabled', [], 'boolean'), + _method('isVisible', [], 'boolean'), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + _method('removeListener', ['ParameterListener']), + _method('setEnabled', ['boolean']), + _method('setLabelKey', ['String']), + _method('setLabelText', ['String']), + _method('setStyle', ['int']), + _method('setVisible', ['boolean']), + ]) + + +class BooleanParameterDataType: + def get_xml_type(): + return "BooleanParameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('addDisabledOnSelection', ['Parameter']), + _method('addEnabledOnSelection', ['Parameter']), + _method('addListener', ['ParameterListener']), + _method('getLabelKey', [], 'String'), + _method('getLabelText', [], 'String'), + _method('getValue', [], 'boolean'), + _method('isEnabled', [], 'boolean'), + _method('isVisible', [], 'boolean'), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + _method('removeListener', ['ParameterListener']), + _method('setEnabled', ['boolean']), + _method('setLabelKey', ['String']), + _method('setLabelText', ['String']), + _method('setValue', ['boolean']), + _method('setVisible', ['boolean']), + ]) + + +class ConfigSectionDataType: + def get_xml_type(): + return "ConfigSection" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'SECTION_CONNECTION': "server", + 'SECTION_FILES': "files", + 'SECTION_INTERFACE': "style", + 'SECTION_PLUGINS': "plugins", + 'SECTION_ROOT': "root", + 'SECTION_TRACKER': "tracker", + 'SECTION_TRANSFER': "transfer", + } + + __az_methods__ = AzureusMethods([ + _method('configSectionDelete'), + _method('configSectionGetName', [], 'String'), + _method('configSectionGetParentSection', [], 'String'), + _method('configSectionSave'), + ]) + + +class ConfigSectionSWTDataType: + def get_xml_type(): + return "ConfigSectionSWT" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'SECTION_CONNECTION': "server", + 'SECTION_FILES': "files", + 'SECTION_INTERFACE': "style", + 'SECTION_PLUGINS': "plugins", + 'SECTION_ROOT': "root", + 'SECTION_TRACKER': "tracker", + 'SECTION_TRANSFER': "transfer", + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Composite configSectionCreate(Composite) + # + __az_methods__ = AzureusMethods([ + _method('configSectionDelete'), + _method('configSectionGetName', [], 'String'), + _method('configSectionGetParentSection', [], 'String'), + _method('configSectionSave'), + ]) + + +class DirectoryParameterDataType: + def get_xml_type(): + return "DirectoryParameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('addListener', ['ParameterListener']), + _method('getLabelKey', [], 'String'), + _method('getLabelText', [], 'String'), + _method('getValue', [], 'String'), + _method('isEnabled', [], 'boolean'), + _method('isVisible', [], 'boolean'), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + _method('removeListener', ['ParameterListener']), + _method('setEnabled', ['boolean']), + _method('setLabelKey', ['String']), + _method('setLabelText', ['String']), + _method('setVisible', ['boolean']), + ]) + + +class EnablerParameterDataType: + def get_xml_type(): + return "EnablerParameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('addDisabledOnSelection', ['Parameter']), + _method('addEnabledOnSelection', ['Parameter']), + _method('addListener', ['ParameterListener']), + _method('getLabelKey', [], 'String'), + _method('getLabelText', [], 'String'), + _method('isEnabled', [], 'boolean'), + _method('isVisible', [], 'boolean'), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + _method('removeListener', ['ParameterListener']), + _method('setEnabled', ['boolean']), + _method('setLabelKey', ['String']), + _method('setLabelText', ['String']), + _method('setVisible', ['boolean']), + ]) + + +class IntParameterDataType: + def get_xml_type(): + return "IntParameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('addListener', ['ParameterListener']), + _method('getLabelKey', [], 'String'), + _method('getLabelText', [], 'String'), + _method('getValue', [], 'int'), + _method('isEnabled', [], 'boolean'), + _method('isVisible', [], 'boolean'), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + _method('removeListener', ['ParameterListener']), + _method('setEnabled', ['boolean']), + _method('setLabelKey', ['String']), + _method('setLabelText', ['String']), + _method('setValue', ['int']), + _method('setVisible', ['boolean']), + ]) + + +class LabelParameterDataType: + def get_xml_type(): + return "LabelParameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('addListener', ['ParameterListener']), + _method('getLabelKey', [], 'String'), + _method('getLabelText', [], 'String'), + _method('isEnabled', [], 'boolean'), + _method('isVisible', [], 'boolean'), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + _method('removeListener', ['ParameterListener']), + _method('setEnabled', ['boolean']), + _method('setLabelKey', ['String']), + _method('setLabelText', ['String']), + _method('setVisible', ['boolean']), + ]) + + +class ParameterDataType: + def get_xml_type(): + return "Parameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('addListener', ['ParameterListener']), + _method('getLabelKey', [], 'String'), + _method('getLabelText', [], 'String'), + _method('isEnabled', [], 'boolean'), + _method('isVisible', [], 'boolean'), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + _method('removeListener', ['ParameterListener']), + _method('setEnabled', ['boolean']), + _method('setLabelKey', ['String']), + _method('setLabelText', ['String']), + _method('setVisible', ['boolean']), + ]) + + +class ParameterGroupDataType: + def get_xml_type(): + return "ParameterGroup" + + get_xml_type = staticmethod(get_xml_type) + + +class ParameterListenerDataType: + def get_xml_type(): + return "ParameterListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('parameterChanged', ['Parameter']), + ]) + + +class PasswordParameterDataType: + def get_xml_type(): + return "PasswordParameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ET_MD5': 3, + 'ET_PLAIN': 1, + 'ET_SHA1': 2, + } + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('addListener', ['ParameterListener']), + _method('getLabelKey', [], 'String'), + _method('getLabelText', [], 'String'), + _method('getValue', [], 'byte[]'), + _method('isEnabled', [], 'boolean'), + _method('isVisible', [], 'boolean'), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + _method('removeListener', ['ParameterListener']), + _method('setEnabled', ['boolean']), + _method('setLabelKey', ['String']), + _method('setLabelText', ['String']), + _method('setVisible', ['boolean']), + ]) + + +class PluginConfigUIFactoryDataType: + def get_xml_type(): + return "PluginConfigUIFactory" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('createBooleanParameter', ['String', 'String', 'boolean'], 'EnablerParameter'), + _method('createColorParameter', ['String', 'String', 'int', 'int', 'int'], 'Parameter'), + _method('createDirectoryParameter', ['String', 'String', 'String'], 'Parameter'), + _method('createFileParameter', ['String', 'String', 'String'], 'Parameter'), + _method('createIntParameter', ['String', 'String', 'int'], 'Parameter'), + _method('createIntParameter', ['String', 'String', 'int', 'int[]', 'String[]'], 'Parameter'), + _method('createStringParameter', ['String', 'String', 'String'], 'Parameter'), + _method('createStringParameter', ['String', 'String', 'String', 'String[]', 'String[]'], 'Parameter'), + ]) + + +class StringListParameterDataType: + def get_xml_type(): + return "StringListParameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('addListener', ['ParameterListener']), + _method('getLabelKey', [], 'String'), + _method('getLabelText', [], 'String'), + _method('getValue', [], 'String'), + _method('isEnabled', [], 'boolean'), + _method('isVisible', [], 'boolean'), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + _method('removeListener', ['ParameterListener']), + _method('setEnabled', ['boolean']), + _method('setLabelKey', ['String']), + _method('setLabelText', ['String']), + _method('setValue', ['String']), + _method('setVisible', ['boolean']), + ]) + + +class StringParameterDataType: + def get_xml_type(): + return "StringParameter" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addConfigParameterListener', ['ConfigParameterListener']), + _method('addListener', ['ParameterListener']), + _method('getLabelKey', [], 'String'), + _method('getLabelText', [], 'String'), + _method('getValue', [], 'String'), + _method('isEnabled', [], 'boolean'), + _method('isVisible', [], 'boolean'), + _method('removeConfigParameterListener', ['ConfigParameterListener']), + _method('removeListener', ['ParameterListener']), + _method('setEnabled', ['boolean']), + _method('setLabelKey', ['String']), + _method('setLabelText', ['String']), + _method('setValue', ['String']), + _method('setVisible', ['boolean']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ui.menus +# +#------------------------------------------------------------------------------ + +class MenuItemDataType: + def get_xml_type(): + return "MenuItem" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'STYLE_CHECK': 2, + 'STYLE_PUSH': 1, + 'STYLE_RADIO': 3, + 'STYLE_SEPARATOR': 4, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getData() + # void setData(Object) + # + __az_methods__ = AzureusMethods([ + _method('addFillListener', ['MenuItemFillListener']), + _method('addListener', ['MenuItemListener']), + _method('getGraphic', [], 'Graphic'), + _method('getResourceKey', [], 'String'), + _method('getStyle', [], 'int'), + _method('isEnabled', [], 'boolean'), + _method('removeFillListener', ['MenuItemFillListener']), + _method('removeListener', ['MenuItemListener']), + _method('setEnabled', ['boolean']), + _method('setGraphic', ['Graphic']), + _method('setStyle', ['int']), + ]) + + +class MenuItemFillListenerDataType: + def get_xml_type(): + return "MenuItemFillListener" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void menuWillBeShown(MenuItem, Object) + # + + +class MenuItemListenerDataType: + def get_xml_type(): + return "MenuItemListener" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void selected(MenuItem, Object) + # + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ui.model +# +#------------------------------------------------------------------------------ + +class BasicPluginConfigModelDataType: + def get_xml_type(): + return "BasicPluginConfigModel" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addActionParameter2', ['String', 'String'], 'ActionParameter'), + _method('addBooleanParameter', ['String', 'String', 'boolean']), + _method('addBooleanParameter2', ['String', 'String', 'boolean'], 'BooleanParameter'), + _method('addDirectoryParameter2', ['String', 'String', 'String'], 'DirectoryParameter'), + _method('addIntParameter2', ['String', 'String', 'int'], 'IntParameter'), + _method('addLabelParameter2', ['String'], 'LabelParameter'), + _method('addPasswordParameter2', ['String', 'String', 'int', 'byte[]'], 'PasswordParameter'), + _method('addStringListParameter2', ['String', 'String', 'String[]', 'String'], 'StringListParameter'), + _method('addStringListParameter2', ['String', 'String', 'String[]', 'String[]', 'String'], + 'StringListParameter'), + _method('addStringParameter', ['String', 'String', 'String']), + _method('addStringParameter2', ['String', 'String', 'String'], 'StringParameter'), + _method('createGroup', ['String', 'Parameter[]'], 'ParameterGroup'), + _method('destroy'), + _method('getParameters', [], 'Parameter[]'), + _method('getParentSection', [], 'String'), + _method('getPluginInterface', [], 'PluginInterface'), + _method('getSection', [], 'String'), + ]) + + +class BasicPluginViewModelDataType: + def get_xml_type(): + return "BasicPluginViewModel" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('destroy'), + _method('getActivity', [], 'UITextField'), + _method('getConfigSectionID', [], 'String'), + _method('getLogArea', [], 'UITextArea'), + _method('getName', [], 'String'), + _method('getProgress', [], 'UIProgressBar'), + _method('getStatus', [], 'UITextField'), + _method('setConfigSectionID', ['String']), + ]) + + +class PluginConfigModelDataType: + def get_xml_type(): + return "PluginConfigModel" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('destroy'), + _method('getPluginInterface', [], 'PluginInterface'), + ]) + + +class PluginViewModelDataType: + def get_xml_type(): + return "PluginViewModel" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('destroy'), + _method('getName', [], 'String'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ui.SWT +# +#------------------------------------------------------------------------------ + +class GraphicSWTDataType: + def get_xml_type(): + return "GraphicSWT" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Image getImage() + # boolean setImage(Image) + # + + +class SWTManagerDataType: + def get_xml_type(): + return "SWTManager" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void addView(PluginView) + # void addView(PluginView, boolean) + # GraphicSWT createGraphic(Image) + # Display getDisplay() + # + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ui.tables +# +#------------------------------------------------------------------------------ + +class TableCellDataType: + def get_xml_type(): + return "TableCell" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void addListeners(Object) + # Object getDataSource() + # Comparable getSortValue() + # Object getToolTip() + # boolean setSortValue(Comparable) + # void setToolTip(Object) + # + __az_methods__ = AzureusMethods([ + _method('addDisposeListener', ['TableCellDisposeListener']), + _method('addMouseListener', ['TableCellMouseListener']), + _method('addRefreshListener', ['TableCellRefreshListener']), + _method('addToolTipListener', ['TableCellToolTipListener']), + _method('getGraphic', [], 'Graphic'), + _method('getHeight', [], 'int'), + _method('getTableColumn', [], 'TableColumn'), + _method('getTableID', [], 'String'), + _method('getTableRow', [], 'TableRow'), + _method('getText', [], 'String'), + _method('getWidth', [], 'int'), + _method('invalidate'), + _method('isDisposed', [], 'boolean'), + _method('isShown', [], 'boolean'), + _method('isValid', [], 'boolean'), + _method('removeDisposeListener', ['TableCellDisposeListener']), + _method('removeMouseListener', ['TableCellMouseListener']), + _method('removeRefreshListener', ['TableCellRefreshListener']), + _method('removeToolTipListener', ['TableCellToolTipListener']), + _method('setFillCell', ['boolean']), + _method('setForeground', ['int', 'int', 'int'], 'boolean'), + _method('setGraphic', ['Graphic'], 'boolean'), + _method('setMarginHeight', ['int']), + _method('setMarginWidth', ['int']), + _method('setSortValue', ['float'], 'boolean'), + _method('setSortValue', ['long'], 'boolean'), + _method('setText', ['String'], 'boolean'), + ]) + + +class TableCellAddedListenerDataType: + def get_xml_type(): + return "TableCellAddedListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('cellAdded', ['TableCell']), + ]) + + +class TableCellDisposeListenerDataType: + def get_xml_type(): + return "TableCellDisposeListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('dispose', ['TableCell']), + ]) + + +class TableCellMouseListenerDataType: + def get_xml_type(): + return "TableCellMouseListener" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void cellMouseTrigger(TableCellMouseEvent) + # + + +class TableCellRefreshListenerDataType: + def get_xml_type(): + return "TableCellRefreshListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('refresh', ['TableCell']), + ]) + + +class TableCellToolTipListenerDataType: + def get_xml_type(): + return "TableCellToolTipListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('cellHover', ['TableCell']), + _method('cellHoverComplete', ['TableCell']), + ]) + + +class TableColumnDataType: + def get_xml_type(): + return "TableColumn" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ALIGN_CENTER': 3, + 'ALIGN_LEAD': 1, + 'ALIGN_TRAIL': 2, + 'INTERVAL_GRAPHIC': -1, + 'INTERVAL_INVALID_ONLY': -3, + 'INTERVAL_LIVE': -2, + 'POSITION_INVISIBLE': -1, + 'POSITION_LAST': -2, + 'TYPE_GRAPHIC': 2, + 'TYPE_TEXT': 1, + 'TYPE_TEXT_ONLY': 3, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void addListeners(Object) + # + __az_methods__ = AzureusMethods([ + _method('addCellAddedListener', ['TableCellAddedListener']), + _method('addCellDisposeListener', ['TableCellDisposeListener']), + _method('addCellMouseListener', ['TableCellMouseListener']), + _method('addCellRefreshListener', ['TableCellRefreshListener']), + _method('addCellToolTipListener', ['TableCellToolTipListener']), + _method('addContextMenuItem', ['String'], 'TableContextMenuItem'), + _method('getAlignment', [], 'int'), + _method('getName', [], 'String'), + _method('getPosition', [], 'int'), + _method('getRefreshInterval', [], 'int'), + _method('getTableID', [], 'String'), + _method('getType', [], 'int'), + _method('getWidth', [], 'int'), + _method('initialize', ['int', 'int', 'int', 'int']), + _method('initialize', ['int', 'int', 'int']), + _method('invalidateCells'), + _method('removeCellAddedListener', ['TableCellAddedListener']), + _method('removeCellDisposeListener', ['TableCellDisposeListener']), + _method('removeCellMouseListener', ['TableCellMouseListener']), + _method('removeCellRefreshListener', ['TableCellRefreshListener']), + _method('removeCellToolTipListener', ['TableCellToolTipListener']), + _method('setAlignment', ['int']), + _method('setPosition', ['int']), + _method('setRefreshInterval', ['int']), + _method('setType', ['int']), + _method('setWidth', ['int']), + ]) + + +class TableContextMenuItemDataType: + def get_xml_type(): + return "TableContextMenuItem" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'STYLE_CHECK': 2, + 'STYLE_PUSH': 1, + 'STYLE_RADIO': 3, + 'STYLE_SEPARATOR': 4, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getData() + # void setData(Object) + # + __az_methods__ = AzureusMethods([ + _method('addFillListener', ['MenuItemFillListener']), + _method('addListener', ['MenuItemListener']), + _method('getGraphic', [], 'Graphic'), + _method('getResourceKey', [], 'String'), + _method('getStyle', [], 'int'), + _method('getTableID', [], 'String'), + _method('isEnabled', [], 'boolean'), + _method('removeFillListener', ['MenuItemFillListener']), + _method('removeListener', ['MenuItemListener']), + _method('setEnabled', ['boolean']), + _method('setGraphic', ['Graphic']), + _method('setStyle', ['int']), + ]) + + +class TableManagerDataType: + def get_xml_type(): + return "TableManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'TABLE_MYSHARES': "MyShares", + 'TABLE_MYTORRENTS_COMPLETE': "MySeeders", + 'TABLE_MYTORRENTS_INCOMPLETE': "MyTorrents", + 'TABLE_MYTRACKER': "MyTracker", + 'TABLE_TORRENT_FILES': "Files", + 'TABLE_TORRENT_PEERS': "Peers", + 'TABLE_TORRENT_PIECES': "Pieces", + } + + __az_methods__ = AzureusMethods([ + _method('addColumn', ['TableColumn']), + _method('addContextMenuItem', ['String', 'String'], 'TableContextMenuItem'), + _method('createColumn', ['String', 'String'], 'TableColumn'), + ]) + + +class TableRowDataType: + def get_xml_type(): + return "TableRow" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getDataSource() + # + __az_methods__ = AzureusMethods([ + _method('getTableCell', ['String'], 'TableCell'), + _method('getTableID', [], 'String'), + _method('isValid', [], 'boolean'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ui.tables.mytorrents +# +#------------------------------------------------------------------------------ + +class MyTorrentsTableItemDataType: + def get_xml_type(): + return "MyTorrentsTableItem" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getDownload', [], 'Download'), + _method('setText', ['String'], 'boolean'), + ]) + + +class PluginMyTorrentsItemDataType: + def get_xml_type(): + return "PluginMyTorrentsItem" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getIntValue', [], 'int'), + _method('getStringValue', [], 'String'), + _method('refresh'), + ]) + + +class PluginMyTorrentsItemFactoryDataType: + def get_xml_type(): + return "PluginMyTorrentsItemFactory" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'ORIENT_LEFT': "L", + 'ORIENT_RIGHT': "R", + 'POSITION_INVISIBLE': -1, + 'POSITION_LAST': -2, + 'TABLE_ALL': 4, + 'TABLE_COMPLETE': 1, + 'TABLE_INCOMPLETE': 2, + 'TYPE_INT': "I", + 'TYPE_STRING': "S", + } + + __az_methods__ = AzureusMethods([ + _method('getDefaultPosition', [], 'int'), + _method('getDefaultSize', [], 'int'), + _method('getInstance', ['MyTorrentsTableItem'], 'PluginMyTorrentsItem'), + _method('getName', [], 'String'), + _method('getOrientation', [], 'String'), + _method('getTablesVisibleIn', [], 'int'), + _method('getType', [], 'String'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.ui.tables.peers +# +#------------------------------------------------------------------------------ + +class PeerTableItemDataType: + def get_xml_type(): + return "PeerTableItem" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getPeer', [], 'Peer'), + _method('setText', ['String'], 'boolean'), + ]) + + +class PluginPeerItemDataType: + def get_xml_type(): + return "PluginPeerItem" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getIntValue', [], 'int'), + _method('getStringValue', [], 'String'), + _method('refresh'), + ]) + + +class PluginPeerItemFactoryDataType: + def get_xml_type(): + return "PluginPeerItemFactory" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'TYPE_INT': "I", + 'TYPE_STRING': "S", + } + + __az_methods__ = AzureusMethods([ + _method('getDefaultSize', [], 'int'), + _method('getInstance', ['PeerTableItem'], 'PluginPeerItem'), + _method('getName', [], 'String'), + _method('getType', [], 'String'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.update +# +#------------------------------------------------------------------------------ + +class UpdatableComponentDataType: + def get_xml_type(): + return "UpdatableComponent" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('checkForUpdate', ['UpdateChecker']), + _method('getMaximumCheckTime', [], 'int'), + _method('getName', [], 'String'), + ]) + + +class UpdateDataType: + def get_xml_type(): + return "Update" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'RESTART_REQUIRED_MAYBE': 3, + 'RESTART_REQUIRED_NO': 1, + 'RESTART_REQUIRED_YES': 2, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object getDecision(int, String, String, Object) + # Object getUserObject() + # void setUserObject(Object) + # + __az_methods__ = AzureusMethods([ + _method('addListener', ['UpdateListener']), + _method('cancel'), + _method('complete'), + _method('getCheckInstance', [], 'UpdateCheckInstance'), + _method('getDescription', [], 'String[]'), + _method('getDownloaders', [], 'ResourceDownloader[]'), + _method('getName', [], 'String'), + _method('getNewVersion', [], 'String'), + _method('getRestartRequired', [], 'int'), + _method('isMandatory', [], 'boolean'), + _method('removeListener', ['UpdateListener']), + _method('setRestartRequired', ['int']), + ]) + + +class UpdateCheckerDataType: + def get_xml_type(): + return "UpdateChecker" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addListener', ['UpdateCheckerListener']), + _method('addProgressListener', ['UpdateProgressListener']), + _method('addUpdate', ['String', 'String[]', 'String', 'ResourceDownloader', 'int'], 'Update'), + _method('addUpdate', ['String', 'String[]', 'String', 'ResourceDownloader[]', 'int'], 'Update'), + _method('completed'), + _method('createInstaller', [], 'UpdateInstaller'), + _method('failed'), + _method('getCheckInstance', [], 'UpdateCheckInstance'), + _method('getComponent', [], 'UpdatableComponent'), + _method('removeListener', ['UpdateCheckerListener']), + _method('removeProgressListener', ['UpdateProgressListener']), + _method('reportProgress', ['String']), + ]) + + +class UpdateCheckerListenerDataType: + def get_xml_type(): + return "UpdateCheckerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('cancelled', ['UpdateChecker']), + _method('completed', ['UpdateChecker']), + _method('failed', ['UpdateChecker']), + ]) + + +class UpdateCheckInstanceDataType: + def get_xml_type(): + return "UpdateCheckInstance" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'UCI_INSTALL': 1, + 'UCI_UNINSTALL': 3, + 'UCI_UPDATE': 2, + } + + __az_methods__ = AzureusMethods([ + _method('addDecisionListener', ['UpdateManagerDecisionListener']), + _method('addListener', ['UpdateCheckInstanceListener']), + _method('addUpdatableComponent', ['UpdatableComponent', 'boolean']), + _method('cancel'), + _method('createInstaller', [], 'UpdateInstaller'), + _method('getCheckers', [], 'UpdateChecker[]'), + _method('getManager', [], 'UpdateManager'), + _method('getName', [], 'String'), + _method('getType', [], 'int'), + _method('getUpdates', [], 'Update[]'), + _method('isCancelled', [], 'boolean'), + _method('removeDecisionListener', ['UpdateManagerDecisionListener']), + _method('removeListener', ['UpdateCheckInstanceListener']), + _method('start'), + ]) + + +class UpdateCheckInstanceListenerDataType: + def get_xml_type(): + return "UpdateCheckInstanceListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('cancelled', ['UpdateCheckInstance']), + _method('complete', ['UpdateCheckInstance']), + ]) + + +class UpdateInstallerDataType: + def get_xml_type(): + return "UpdateInstaller" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void addResource(String, InputStream) + # void addResource(String, InputStream, boolean) + # + __az_methods__ = AzureusMethods([ + _method('addChangeRightsAction', ['String', 'String']), + _method('addMoveAction', ['String', 'String']), + _method('addRemoveAction', ['String']), + _method('getInstallDir', [], 'String'), + _method('getUserDir', [], 'String'), + ]) + + +class UpdateListenerDataType: + def get_xml_type(): + return "UpdateListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('complete', ['Update']), + ]) + + +class UpdateManagerDataType: + def get_xml_type(): + return "UpdateManager" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addListener', ['UpdateManagerListener']), + _method('applyUpdates', ['boolean']), + _method('createEmptyUpdateCheckInstance', ['int', 'String'], 'UpdateCheckInstance'), + _method('createInstaller', [], 'UpdateInstaller'), + _method('createUpdateCheckInstance', [], 'UpdateCheckInstance'), + _method('createUpdateCheckInstance', ['int', 'String'], 'UpdateCheckInstance'), + _method('getInstallers', [], 'UpdateInstaller[]'), + _method('registerUpdatableComponent', ['UpdatableComponent', 'boolean']), + _method('removeListener', ['UpdateManagerListener']), + _method('restart'), + ]) + + +class UpdateManagerDecisionListenerDataType: + def get_xml_type(): + return "UpdateManagerDecisionListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'DT_STRING_ARRAY_TO_STRING': 0, + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Object decide(Update, int, String, String, Object) + # + + +class UpdateManagerListenerDataType: + def get_xml_type(): + return "UpdateManagerListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('checkInstanceCreated', ['UpdateCheckInstance']), + ]) + + +class UpdateProgressListenerDataType: + def get_xml_type(): + return "UpdateProgressListener" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('reportProgress', ['String']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.utils +# +#------------------------------------------------------------------------------ + +class AggregatedDispatcherDataType: + def get_xml_type(): + return "AggregatedDispatcher" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void add(Runnable) + # Runnable remove(Runnable) + # + __az_methods__ = AzureusMethods([ + _method('destroy'), + ]) + + +class AggregatedListDataType: + def get_xml_type(): + return "AggregatedList" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void add(Object) + # Object remove(Object) + # + __az_methods__ = AzureusMethods([ + _method('destroy'), + ]) + + +class AggregatedListAcceptorDataType: + def get_xml_type(): + return "AggregatedListAcceptor" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void accept(List) + # + + +class ByteArrayWrapperDataType: + def get_xml_type(): + return "ByteArrayWrapper" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getBytes', [], 'byte[]'), + ]) + + +class FormattersDataType: + def get_xml_type(): + return "Formatters" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Map bDecode(byte[]) + # byte[] bEncode(Map) + # Comparator getAlphanumericComparator(boolean) + # + __az_methods__ = AzureusMethods([ + _method('base32Decode', ['String'], 'byte[]'), + _method('base32Encode', ['byte[]'], 'String'), + _method('decodeBytesFromString', ['String'], 'byte[]'), + _method('encodeBytesToString', ['byte[]'], 'String'), + _method('formatByteArray', ['byte[]', 'boolean'], 'String'), + _method('formatByteCountToKiBEtc', ['long'], 'String'), + _method('formatByteCountToKiBEtcPerSec', ['long'], 'String'), + _method('formatDate', ['long'], 'String'), + _method('formatPercentFromThousands', ['long'], 'String'), + _method('formatTimeFromSeconds', ['long'], 'String'), + ]) + + +class LocaleDecoderDataType: + def get_xml_type(): + return "LocaleDecoder" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('decode', ['byte[]'], 'String'), + _method('getName', [], 'String'), + ]) + + +class LocaleListenerDataType: + def get_xml_type(): + return "LocaleListener" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # void localeChanged(Locale) + # + + +class LocaleUtilitiesDataType: + def get_xml_type(): + return "LocaleUtilities" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addListener', ['LocaleListener']), + _method('getDecoders', [], 'LocaleDecoder[]'), + _method('getLocalisedMessageText', ['String'], 'String'), + _method('getLocalisedMessageText', ['String', 'String[]'], 'String'), + _method('integrateLocalisedMessageBundle', ['String']), + _method('removeListener', ['LocaleListener']), + ]) + + +class MonitorDataType: + def get_xml_type(): + return "Monitor" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('enter'), + _method('exit'), + _method('hasWaiters', [], 'boolean'), + _method('isOwned', [], 'boolean'), + ]) + + +class PooledByteBufferDataType: + def get_xml_type(): + return "PooledByteBuffer" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # ByteBuffer toByteBuffer() + # + __az_methods__ = AzureusMethods([ + _method('returnToPool'), + _method('toByteArray', [], 'byte[]'), + ]) + + +class SemaphoreDataType: + def get_xml_type(): + return "Semaphore" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('release'), + _method('reserve'), + _method('reserve', ['long'], 'boolean'), + _method('reserveIfAvailable', [], 'boolean'), + ]) + + +class ShortCutsDataType: + def get_xml_type(): + return "ShortCuts" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getDownload', ['byte[]'], 'Download'), + _method('getDownloadStats', ['byte[]'], 'DownloadStats'), + _method('removeDownload', ['byte[]']), + _method('restartDownload', ['byte[]']), + _method('stopDownload', ['byte[]']), + ]) + + +class UtilitiesDataType: + def get_xml_type(): + return "Utilities" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # ByteBuffer allocateDirectByteBuffer(int) + # void createThread(String, Runnable) + # void freeDirectByteBuffer(ByteBuffer) + # InputStream getImageAsStream(String) + # InetAddress getPublicAddress() + # Map readResilientBEncodedFile(File, String, boolean) + # String reverseDNSLookup(InetAddress) + # void writeResilientBEncodedFile(File, String, Map, boolean) + # + __az_methods__ = AzureusMethods([ + _method('allocatePooledByteBuffer', ['byte[]'], 'PooledByteBuffer'), + _method('allocatePooledByteBuffer', ['int'], 'PooledByteBuffer'), + _method('compareVersions', ['String', 'String'], 'int'), + _method('createAggregatedDispatcher', ['long', 'long'], 'AggregatedDispatcher'), + _method('createAggregatedList', ['AggregatedListAcceptor', 'long', 'long'], 'AggregatedList'), + _method('createProcess', ['String']), + _method('createTimer', ['String', 'boolean'], 'UTTimer'), + _method('createTimer', ['String'], 'UTTimer'), + _method('createWrapper', ['byte[]'], 'ByteArrayWrapper'), + _method('getAzureusProgramDir', [], 'String'), + _method('getAzureusUserDir', [], 'String'), + _method('getCurrentSystemTime', [], 'long'), + _method('getFormatters', [], 'Formatters'), + _method('getLocaleUtilities', [], 'LocaleUtilities'), + _method('getMonitor', [], 'Monitor'), + _method('getResourceDownloaderFactory', [], 'ResourceDownloaderFactory'), + _method('getResourceUploaderFactory', [], 'ResourceUploaderFactory'), + _method('getRSSFeed', ['URL'], 'RSSFeed'), + _method('getRSSFeed', ['ResourceDownloader'], 'RSSFeed'), + _method('getSecurityManager', [], 'SESecurityManager'), + _method('getSemaphore', [], 'Semaphore'), + _method('getSimpleXMLParserDocumentFactory', [], 'SimpleXMLParserDocumentFactory'), + _method('isCVSVersion', [], 'boolean'), + _method('isLinux', [], 'boolean'), + _method('isOSX', [], 'boolean'), + _method('isSolaris', [], 'boolean'), + _method('isWindows', [], 'boolean'), + ]) + + +class UTTimerDataType: + def get_xml_type(): + return "UTTimer" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('addEvent', ['long', 'UTTimerEventPerformer'], 'UTTimerEvent'), + _method('addPeriodicEvent', ['long', 'UTTimerEventPerformer'], 'UTTimerEvent'), + _method('destroy'), + ]) + + +class UTTimerEventDataType: + def get_xml_type(): + return "UTTimerEvent" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('cancel'), + ]) + + +class UTTimerEventPerformerDataType: + def get_xml_type(): + return "UTTimerEventPerformer" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('perform', ['UTTimerEvent']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.utils.resourcedownloader +# +#------------------------------------------------------------------------------ + +class ResourceDownloaderDataType: + def get_xml_type(): + return "ResourceDownloader" + + get_xml_type = staticmethod(get_xml_type) + + __az_constants__ = { + 'PR_STRING_CONTENT_TYPE': "ContentType", + } + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # InputStream download() + # Object getProperty(String) + # + __az_methods__ = AzureusMethods([ + _method('addListener', ['ResourceDownloaderListener']), + _method('asyncDownload'), + _method('cancel'), + _method('getName', [], 'String'), + _method('getSize', [], 'long'), + _method('isCancelled', [], 'boolean'), + _method('removeListener', ['ResourceDownloaderListener']), + _method('reportActivity', ['String']), + ]) + + +class ResourceDownloaderDelayedFactoryDataType: + def get_xml_type(): + return "ResourceDownloaderDelayedFactory" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('create', [], 'ResourceDownloader'), + ]) + + +class ResourceDownloaderFactoryDataType: + def get_xml_type(): + return "ResourceDownloaderFactory" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('create', ['File'], 'ResourceDownloader'), + _method('create', ['ResourceDownloaderDelayedFactory'], 'ResourceDownloader'), + _method('create', ['URL', 'String', 'String'], 'ResourceDownloader'), + _method('create', ['URL'], 'ResourceDownloader'), + _method('getAlternateDownloader', ['ResourceDownloader[]', 'int'], 'ResourceDownloader'), + _method('getAlternateDownloader', ['ResourceDownloader[]'], 'ResourceDownloader'), + _method('getMetaRefreshDownloader', ['ResourceDownloader'], 'ResourceDownloader'), + _method('getRandomDownloader', ['ResourceDownloader[]'], 'ResourceDownloader'), + _method('getRandomDownloader', ['ResourceDownloader[]', 'int'], 'ResourceDownloader'), + _method('getRetryDownloader', ['ResourceDownloader', 'int'], 'ResourceDownloader'), + _method('getSuffixBasedDownloader', ['ResourceDownloader'], 'ResourceDownloader'), + _method('getTimeoutDownloader', ['ResourceDownloader', 'int'], 'ResourceDownloader'), + _method('getTorrentDownloader', ['ResourceDownloader', 'boolean'], 'ResourceDownloader'), + _method('getTorrentDownloader', ['ResourceDownloader', 'boolean', 'File'], 'ResourceDownloader'), + ]) + + +class ResourceDownloaderListenerDataType: + def get_xml_type(): + return "ResourceDownloaderListener" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # boolean completed(ResourceDownloader, InputStream) + # void failed(ResourceDownloader, ResourceDownloaderException) + # + __az_methods__ = AzureusMethods([ + _method('reportActivity', ['ResourceDownloader', 'String']), + _method('reportPercentComplete', ['ResourceDownloader', 'int']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.utils.resourceuploader +# +#------------------------------------------------------------------------------ + +class ResourceUploaderDataType: + def get_xml_type(): + return "ResourceUploader" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # InputStream upload() + # + + +class ResourceUploaderFactoryDataType: + def get_xml_type(): + return "ResourceUploaderFactory" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # ResourceUploader create(URL, InputStream) + # ResourceUploader create(URL, InputStream, String, String) + # + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.utils.security +# +#------------------------------------------------------------------------------ + +class CertificateListenerDataType: + def get_xml_type(): + return "CertificateListener" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # boolean trustCertificate(String, X509Certificate) + # + + +class PasswordListenerDataType: + def get_xml_type(): + return "PasswordListener" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # PasswordAuthentication getAuthentication(String, URL) + # + __az_methods__ = AzureusMethods([ + _method('setAuthenticationOutcome', ['String', 'URL', 'boolean']), + ]) + + +class SESecurityManagerDataType: + def get_xml_type(): + return "SESecurityManager" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Certificate createSelfSignedCertificate(String, String, int) + # KeyStore getKeyStore() + # KeyStore getTrustStore() + # SSLSocketFactory installServerCertificate(URL) + # void runWithAuthenticator(Authenticator, Runnable) + # + __az_methods__ = AzureusMethods([ + _method('addCertificateListener', ['CertificateListener']), + _method('addPasswordListener', ['PasswordListener']), + _method('calculateSHA1', ['byte[]'], 'byte[]'), + _method('removeCertificateListener', ['CertificateListener']), + _method('removePasswordListener', ['PasswordListener']), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.utils.xml.rss +# +#------------------------------------------------------------------------------ + +class RSSChannelDataType: + def get_xml_type(): + return "RSSChannel" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Date getPublicationDate() + # + __az_methods__ = AzureusMethods([ + _method('getDescription', [], 'String'), + _method('getItems', [], 'RSSItem[]'), + _method('getLink', [], 'URL'), + _method('getNode', [], 'SimpleXMLParserDocumentNode'), + _method('getTitle', [], 'String'), + ]) + + +class RSSFeedDataType: + def get_xml_type(): + return "RSSFeed" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getChannels', [], 'RSSChannel[]'), + ]) + + +class RSSItemDataType: + def get_xml_type(): + return "RSSItem" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # Date getPublicationDate() + # + __az_methods__ = AzureusMethods([ + _method('getDescription', [], 'String'), + _method('getLink', [], 'URL'), + _method('getNode', [], 'SimpleXMLParserDocumentNode'), + _method('getTitle', [], 'String'), + ]) + + +#------------------------------------------------------------------------------ +# +# Classes for package: +# org.gudy.azureus2.plugins.utils.xml.simpleparser +# +#------------------------------------------------------------------------------ + +class SimpleXMLParserDocumentDataType: + def get_xml_type(): + return "SimpleXMLParserDocument" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getAttribute', ['String'], 'SimpleXMLParserDocumentAttribute'), + _method('getAttributes', [], 'SimpleXMLParserDocumentAttribute[]'), + _method('getChild', ['String'], 'SimpleXMLParserDocumentNode'), + _method('getChildren', [], 'SimpleXMLParserDocumentNode[]'), + _method('getName', [], 'String'), + _method('getValue', [], 'String'), + _method('print'), + ]) + + +class SimpleXMLParserDocumentAttributeDataType: + def get_xml_type(): + return "SimpleXMLParserDocumentAttribute" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getName', [], 'String'), + _method('getValue', [], 'String'), + ]) + + +class SimpleXMLParserDocumentFactoryDataType: + def get_xml_type(): + return "SimpleXMLParserDocumentFactory" + + get_xml_type = staticmethod(get_xml_type) + + # + # The following methods are not available, because either the return + # type is not supported or / and one or more parameters are not + # remotely supported: + # + # SimpleXMLParserDocument create(InputStream) + # + __az_methods__ = AzureusMethods([ + _method('create', ['File'], 'SimpleXMLParserDocument'), + _method('create', ['String'], 'SimpleXMLParserDocument'), + ]) + + +class SimpleXMLParserDocumentNodeDataType: + def get_xml_type(): + return "SimpleXMLParserDocumentNode" + + get_xml_type = staticmethod(get_xml_type) + + __az_methods__ = AzureusMethods([ + _method('getAttribute', ['String'], 'SimpleXMLParserDocumentAttribute'), + _method('getAttributes', [], 'SimpleXMLParserDocumentAttribute[]'), + _method('getChild', ['String'], 'SimpleXMLParserDocumentNode'), + _method('getChildren', [], 'SimpleXMLParserDocumentNode[]'), + _method('getName', [], 'String'), + _method('getValue', [], 'String'), + ]) + + +del _method + +# XXX: Sort this out. +PluginConfigDataType.__az_attributes__['cached_property_values'] = 'int[]' + +# Temporary value - should be removed once the import has finished. +import dopal + +__epydoc_mode = dopal.__dopal_mode__ == 2 + +classes_to_undefine = [] + +_class_map = {} +for classname, classobject in locals().items(): + if hasattr(classobject, 'get_xml_type'): + _class_map[classname] = classobject + if __epydoc_mode: + + # These classes are required to be defined to get the epydoc code + # generation to work, because we have custom methods defined. + # + # We used to generate API documentation for all classes - but this + # was generating far too much documentation. So now we just filter + # it down to those classes which need to exist for obj_impl to be + # imported properly. + accepted_classes = [ + 'Download', 'DownloadAnnounceResult', 'DownloadScrapeResult', + 'DownloadStats', 'PluginConfig', 'PluginInterface', 'Torrent', + 'DiskManagerFileInfo', 'LoggerChannel', 'Peer', + ] + classobject.__plugin_class__ = True + if classobject.get_xml_type() not in accepted_classes: + classes_to_undefine.append(classname) +del classname, classobject, __epydoc_mode + +# Epydoc code - prevents these classes from being generated. +for class_to_undefine in classes_to_undefine: + del globals()[class_to_undefine] + del _class_map[class_to_undefine] + del class_to_undefine +del classes_to_undefine diff --git a/resources/utorrent/dopal/class_defs.pyc b/resources/utorrent/dopal/class_defs.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7aca714e623cbb64bc7fbb64aa88951833fa5a31 GIT binary patch literal 173205 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

    ") + } + + def listdirs(self): + obj = self.action('action=list-dirs') + if not obj: + return False + items = [] + clean = [] + for r in obj.get('download-dirs', []): + available = int(r['available']) + if available > 1024: + memory = '[%s GB]' % str(available / 1024) + else: + memory = '[%s MB]' % str(available) + items.append(r['path'] + ' ' + memory) + path = r['path'] + if path[len(path) - 1:] != '\\': path += '\\' + clean.append(path) + return items, clean + + def list(self): + obj = self.action('list=1') + if not obj: + return False + + res = [] + for r in obj.get('torrents', []): + res.append({ + 'id': r[0], + 'status': self.get_status(r[1], r[4] / 10), + 'name': r[2], + 'size': r[3], + 'progress': r[4] / 10, + 'download': r[5], + 'upload': r[6], + 'ratio': float(r[7]) / 1000, + 'upspeed': r[8], + 'downspeed': r[9], + 'eta': r[10], + 'peer': r[12] + r[14], + 'leach': r[12], + 'seed': r[14], + 'add': r[23], + 'finish': r[24], + 'dir': r[26] + }) + + return res + + def listfiles(self, id): + obj = self.action('action=getfiles&hash=' + id) + if not obj: + return None + res = [] + i = -1 + + for x in obj['files'][1]: + i += 1 + if x[1] >= 1024 * 1024 * 1024: + size = str(x[1] / (1024 * 1024 * 1024)) + 'GB' + elif x[1] >= 1024 * 1024: + size = str(x[1] / (1024 * 1024)) + 'MB' + elif x[1] >= 1024: + size = str(x[1] / 1024) + 'KB' + else: + size = str(x[1]) + 'B' + res.append((x[0], (int(x[2] * 100 / x[1])), i, size)) + return res + + def dirid(self, dirname): + if __settings__.getSetting("torrent_save") == '0': + dirid = self.listdirs()[1].index(dirname) + else: + dirname = __settings__.getSetting("torrent_dir") + clean = self.listdirs()[1] + try: + dirid = clean.index(dirname) + except: + dirid = 0 + return dirid + + def add(self, torrent, dirname): + dirid = self.dirid(dirname) + res = self.action('action=add-file&download_dir=' + str(dirid), + {'name': 'torrent_file', 'download_dir': str(dirid), + 'content-type': 'application/x-bittorrent', 'body': torrent}) + return True if res else None + + def add_url(self, torrent, dirname): + dirid = self.dirid(dirname) + res = self.action('action=add-url&download_dir=' + str(dirid) + '&s=' + urllib.quote(torrent)) + return True if res else None + + def setprio(self, id, ind): + obj = self.action('action=getfiles&hash=' + id) + + if not obj or ind == None: + return None + + i = -1 + for x in obj['files'][1]: + i += 1 + if x[3] == 2: self.setprio_simple(id, '0', i) + + res = self.setprio_simple(id, '3', ind) + + return True if res else None + + def setprio_simple(self, id, prio, ind): + obj = self.action('action=setprio&hash=%s&p=%s&f=%s' % (id, prio, ind)) + + if not obj or ind == None: + return None + + return True if obj else None + + def delete(self, id): + pass + + def action(self, uri, upload=None): + cookie, token = self.get_token() + if not cookie: + return None + + req = HTTPRequest(self.url + '?' + uri + '&token=' + token, headers={'Cookie': cookie}, + auth_username=self.login, auth_password=self.password) + if upload: + req.upload = upload + + response = self.http.fetch(req) + if response.error: + return None + else: + try: + obj = json.loads(response.body) + except: + return None + else: + return obj + + def action_simple(self, action, id): + obj = self.action('action=%s&hash=%s' % (action, id)) + return True if obj else None + + def get_token(self): + response = self.http.fetch(self.url + 'token.html', auth_username=self.login, auth_password=self.password) + if response.error: + return None, None + + r = self.re['cookie'].search(response.headers.get('set-cookie', '')) + if r: + cookie = r.group(1).strip() + r = self.re['token'].search(response.body) + if r: + token = r.group(1).strip() + if cookie and token: + return 'GUID=' + cookie, token + + return None, None + + def get_status(self, status, progress): + mapping = { + 'error': 'stopped', + 'paused': 'stopped', + 'forcepaused': 'stopped', + 'stopped': 'stopped', + 'notloaded': 'check_pending', + 'checked': 'checking', + 'queued': 'download_pending', + 'downloading': 'downloading', + 'forcedownloading': 'downloading', + 'finished': 'seed_pending', + 'queuedseed': 'seed_pending', + 'seeding': 'seeding', + 'forceseeding': 'seeding' + } + return mapping[self.get_status_raw(status, progress)] + + def get_status_raw(self, status, progress): + """ + Return status: notloaded, error, checked, + paused, forcepaused, + queued, + downloading, + finished, forcedownloading + queuedseed, seeding, forceseeding + """ + + started = bool(status & 1) + checking = bool(status & 2) + start_after_check = bool(status & 4) + checked = bool(status & 8) + error = bool(status & 16) + paused = bool(status & 32) + queued = bool(status & 64) + loaded = bool(status & 128) + + if not loaded: + return 'notloaded' + + if error: + return 'error' + + if checking: + return 'checked' + + if paused: + if queued: + return 'paused' + else: + return 'forcepaused' + + if progress == 100: + + if queued: + if started: + return 'seeding' + else: + return 'queuedseed' + + else: + if started: + return 'forceseeding' + else: + return 'finished' + else: + + if queued: + if started: + return 'downloading' + else: + return 'queued' + + else: + if started: + return 'forcedownloading' + + return 'stopped' + + +class Transmission: + def config(self, login, password, host, port, url): + self.login = login + self.password = password + + self.url = 'http://' + host + if port: + self.url += ':' + str(port) + + if url[0] != '/': + url = '/' + url + if url[-1] != '/': + url += '/' + + self.url += url + + self.http = HTTP() + + self.token = '0' + + def list(self): + obj = self.action({'method': 'torrent-get', 'arguments': { + 'fields': ['id', 'status', 'name', 'totalSize', 'sizeWhenDone', 'leftUntilDone', 'downloadedEver', + 'uploadedEver', 'uploadRatio', 'rateUpload', 'rateDownload', 'eta', 'peersConnected', + 'peersFrom', + 'addedDate', 'doneDate', 'downloadDir', 'fileStats', 'peersConnected', 'peersGettingFromUs', + 'peersSendingToUs']}}) + if obj is None: + return False + + res = [] + for r in obj['arguments'].get('torrents', []): + if len(r['fileStats']) > 1: + res.append({ + 'id': str(r['id']), + 'status': self.get_status(r['status']), + 'name': r['name'], + 'size': r['totalSize'], + 'progress': 0 if not r['sizeWhenDone'] else int( + 100.0 * float(r['sizeWhenDone'] - r['leftUntilDone']) / float(r['sizeWhenDone'])), + 'download': r['downloadedEver'], + 'upload': r['uploadedEver'], + 'upspeed': r['rateUpload'], + 'downspeed': r['rateDownload'], + 'ratio': float(r['uploadRatio']), + 'eta': r['eta'], + 'peer': r['peersConnected'], + 'seed': r['peersSendingToUs'], + 'leech': r['peersGettingFromUs'], + 'add': r['addedDate'], + 'finish': r['doneDate'], + 'dir': os.path.join(r['downloadDir'], r['name']) + }) + else: + res.append({ + 'id': str(r['id']), + 'status': self.get_status(r['status']), + 'name': r['name'], + 'size': r['totalSize'], + 'progress': 0 if not r['sizeWhenDone'] else int( + 100.0 * float(r['sizeWhenDone'] - r['leftUntilDone']) / float(r['sizeWhenDone'])), + 'download': r['downloadedEver'], + 'upload': r['uploadedEver'], + 'upspeed': r['rateUpload'], + 'downspeed': r['rateDownload'], + 'ratio': float(r['uploadRatio']), + 'eta': r['eta'], + 'peer': r['peersConnected'], + 'seed': r['peersSendingToUs'], + 'leech': r['peersGettingFromUs'], + 'add': r['addedDate'], + 'finish': r['doneDate'], + 'dir': r['downloadDir'] + }) + + return res + + def listdirs(self): + obj = self.action({'method': 'session-get'}) + if obj is None: + return False + + res = [obj['arguments'].get('download-dir')] + # Debug('[Transmission][listdirs]: %s' % (str(res))) + return res, res + + def listfiles(self, id): + obj = self.action({"method": "torrent-get", "arguments": { + "fields": ["id", "activityDate", "corruptEver", "desiredAvailable", "downloadedEver", "fileStats", + "haveUnchecked", "haveValid", "peers", "startDate", "trackerStats", "comment", "creator", + "dateCreated", "files", "hashString", "isPrivate", "pieceCount", "pieceSize"], + "ids": [int(id)]}})['arguments']['torrents'][0] + if obj is None: + return None + + res = [] + i = -1 + + lenf = len(obj['files']) + for x in obj['files']: + i += 1 + if x['length'] >= 1024 * 1024 * 1024: + size = str(x['length'] / (1024 * 1024 * 1024)) + 'GB' + elif x['length'] >= 1024 * 1024: + size = str(x['length'] / (1024 * 1024)) + 'MB' + elif x['length'] >= 1024: + size = str(x['length'] / 1024) + 'KB' + else: + size = str(x['length']) + 'B' + if lenf > 1: + x['name'] = x['name'].strip('/\\').replace('\\', '/') + x['name'] = x['name'].replace(x['name'].split('/')[0] + '/', '') + res.append([x['name'], (int(x['bytesCompleted'] * 100 / x['length'])), i, size]) + return res + + def add(self, torrent, dirname): + if self.action({'method': 'torrent-add', + 'arguments': {'download-dir': dirname, 'metainfo': base64.b64encode(torrent)}}) is None: + return None + return True + + def add_url(self, torrent, dirname): + if self.action({'method': 'torrent-add', 'arguments': {'download-dir': dirname, 'filename': torrent}}) is None: + return None + return True + + def delete(self, id): + pass + + def setprio(self, id, ind): + obj = self.action({"method": "torrent-get", "arguments": {"fields": ["id", "fileStats", "files"], + "ids": [int(id)]}})['arguments']['torrents'][0] + if not obj or ind == None: + return None + + inds = [] + i = -1 + + for x in obj['fileStats']: + i += 1 + if x['wanted'] == True and x['priority'] == 0: + inds.append(i) + + if len(inds) > 1: self.action( + {"method": "torrent-set", "arguments": {"ids": [int(id)], "priority-high": inds, "files-unwanted": inds}}) + + res = self.setprio_simple(id, '3', ind) + + # self.action_simple('start',id) + + return True if res else None + + def setprio_simple(self, id, prio, ind): + if ind == None: + return None + + res = None + inds = [int(ind)] + + if prio == '3': + res = self.action( + {"method": "torrent-set", "arguments": {"ids": [int(id)], "priority-high": inds, "files-wanted": inds}}) + elif prio == '0': + res = self.action({"method": "torrent-set", + "arguments": {"ids": [int(id)], "priority-high": inds, "files-unwanted": inds}}) + + return True if res else None + + def action(self, request): + try: + jsobj = json.dumps(request) + except: + return None + else: + + while True: + # пробуем сделать запрос + if self.login: + response = self.http.fetch(self.url + 'rpc/', method='POST', params=jsobj, + headers={'X-Transmission-Session-Id': self.token, + 'X-Requested-With': 'XMLHttpRequest', + 'Content-Type': 'charset=UTF-8'}, auth_username=self.login, + auth_password=self.password) + else: + response = self.http.fetch(self.url + 'rpc/', method='POST', params=jsobj, + headers={'X-Transmission-Session-Id': self.token, + 'X-Requested-With': 'XMLHttpRequest', + 'Content-Type': 'charset=UTF-8'}) + + if response.error: + + # требуется авторизация? + if response.code == 401: + if not self.get_auth(): + return None + + # требуется новый токен? + elif response.code == 409: + if not self.get_token(response.error): + return None + + else: + return None + + else: + try: + obj = json.loads(response.body) + except: + return None + else: + return obj + + def action_simple(self, action, id): + actions = {'start': {"method": "torrent-start", "arguments": {"ids": [int(id)]}}, + 'stop': {"method": "torrent-stop", "arguments": {"ids": [int(id)]}}, + 'remove': {"method": "torrent-remove", "arguments": {"ids": [int(id)], "delete-local-data": False}}, + 'removedata': {"method": "torrent-remove", + "arguments": {"ids": [int(id)], "delete-local-data": True}}} + obj = self.action(actions[action]) + return True if obj else None + + def get_auth(self): + response = self.http.fetch(self.url, auth_username=self.login, auth_password=self.password) + if response.error: + if response.code == 409: + return self.get_token(response.error) + return False + + def get_token(self, error): + token = error.headers.get('x-transmission-session-id') + if not token: + return False + self.token = token + return True + + def get_status(self, code): + mapping = { + 0: 'stopped', + 1: 'check_pending', + 2: 'checking', + 3: 'download_pending', + 4: 'downloading', + 5: 'seed_pending', + 6: 'seeding' + } + return mapping[code] + + +class Vuze: + def config(self, login, password, host, port, url): + self.login = login + self.password = password + + self.connection = dopal.main.make_connection(host=host, port=port, user=login, password=password) + try: + self.interface = self.connection.getPluginInterface() + self.downloads = self.interface.getDownloadManager().getDownloads() + except: + self.downloads = False + + def list(self): + + if self.downloads == False: + return self.downloads + + i = -1 + res = [] + for r in self.downloads: + i += 1 + res.append({ + 'id': str(i), + 'status': self.get_status(int(getattr(r, 'state'))), + 'name': getattr(getattr(r, 'torrent'), 'name'), + 'size': getattr(getattr(r, 'torrent'), 'size'), + 'progress': round( + float(long(r.stats.downloaded) + 1 / (long(r.stats.downloaded) + long(r.stats.remaining) + 1)), + 4) * 100, + 'download': float(getattr(getattr(r, 'stats'), 'downloaded')), + 'upload': getattr(getattr(r, 'stats'), 'uploaded'), + # 'upspeed': r['rateUpload'], + #'downspeed': r['rateDownload'], + 'ratio': float(r.stats.share_ratio) / 1000, + 'eta': getattr(getattr(r, 'stats'), 'eta'), + 'peer': getattr(getattr(r, 'scrape_result'), 'non_seed_count') + getattr(getattr(r, 'scrape_result'), + 'seed_count'), + 'seed': getattr(getattr(r, 'scrape_result'), 'seed_count'), + 'leech': getattr(getattr(r, 'scrape_result'), 'non_seed_count'), + 'add': getattr(r, 'creation_time'), + 'finish': getattr(r, 'creation_time') + getattr(getattr(r, 'stats'), 'seconds_downloading'), + 'dir': getattr(r, 'save_path') + }) + + return res + + def listdirs(self): + res = [] + return res, res + + def listfiles(self, id): + obj = self.downloads[int(id)].getDiskManagerFileInfo() + if obj is None: + return None + + res = [] + i = -1 + + for x in obj: + i += 1 + if long(x.length) >= 1024 * 1024 * 1024: + size = str(long(x.length) / (1024 * 1024 * 1024)) + 'GB' + elif long(x.length) >= 1024 * 1024: + size = str(long(x.length) / (1024 * 1024)) + 'MB' + elif x.length >= 1024: + size = str(long(x.length) / 1024) + 'KB' + else: + size = str(long(x.length)) + 'B' + + if '\\' in x.file: + title = x.file.split('\\')[-1] + elif '/' in x.file: + title = x.file.split('/')[-1] + else: + title = x.file + res.append([title, (long(x.downloaded * 100 / long(x.length))), i, size]) + return res + + def add(self, torrent, dirname): + torrent = self.interface.getTorrentManager().createFromBEncodedData(torrent) + obj = self.interface.getDownloadManager().addDownload(torrent) + return True if obj else None + + def add_url(self, torrent, dirname): + + obj = self.interface.getDownloadManager().addDownload(torrent) + return True if obj else None + + def delete(self, id): + pass + + def setprio(self, id, ind): + self.setprioobj = self.downloads[int(id)].getDiskManagerFileInfo() + # -1 low, 0 normal, 1 high + + if not self.setprioobj or ind == None: + return None + + i = -1 + for x in self.setprioobj: + i += 1 + if not x.isPriority(): self.setprio_simple_vuze(id, i, skip=True, prio=-1) + + res = self.setprio_simple_vuze(id, ind, skip=False, prio=1) + + return True if res else None + + def setprio_simple(self, id, prio, ind): + if ind == None: + return None + + res = None + + if prio == '0': + res = self.setprio_simple_vuze(id, ind, skip=True, prio=-1) + elif prio == '3': + res = self.setprio_simple_vuze(id, ind, skip=False, prio=1) + + def setprio_simple_vuze(self, id, ind, skip=None, prio=None): + obj = None + + self.setprioobj = self.downloads[int(id)].getDiskManagerFileInfo() + + if prio != None: + obj = self.setprioobj[int(ind)].setNumericPriority(prio) + + if skip != None: + obj = self.setprioobj[int(ind)].setSkipped(skip) + + if not obj or ind == None: + return None + time.sleep(0.1) + return True if obj else None + + def action_simple(self, action, id): + torrent = self.downloads[int(id)] + obj = None + if action == 'start': + obj = torrent.restart() + if action == 'stop': + obj = torrent.stopDownload() + if action == 'remove': + obj = torrent.remove() + if action == 'removedata': + obj = torrent.remove(True, True) + + return True if obj else None + + def get_status(self, status): + mapping = ['stopped', 'download_pending', 'download_pending', 'download_pending', 'downloading', 'seeding', + 'seed_pending', 'stopped', 'stopped', 'download_pending'] + return mapping[status] + + +class Download(): + def __init__(self): + self.handle() + + def handle(self): + config = self.get_torrent_client() + + if self.client == 'utorrent': + self.client = UTorrent() + + elif self.client == 'transmission': + self.client = Transmission() + + elif self.client == 'vuze': + self.client = Vuze() + + self.client.config(host=config['host'], port=config['port'], login=config['login'], password=config['password'], + url=config['url']) + # print(self.client.list()) + return True + + def get_torrent_client(self): + self.setting = __settings__ + client = self.setting.getSetting("torrent") + config = {} + if client == '0': + self.client = 'utorrent' + config = { + 'host': self.setting.getSetting("torrent_utorrent_host"), + 'port': self.setting.getSetting("torrent_utorrent_port"), + 'url': '', + 'login': self.setting.getSetting("torrent_utorrent_login"), + 'password': self.setting.getSetting("torrent_utorrent_password") + } + elif client == '1': + self.client = 'transmission' + config = { + 'host': self.setting.getSetting("torrent_transmission_host"), + 'port': self.setting.getSetting("torrent_transmission_port"), + 'url': self.setting.getSetting("torrent_transmission_url"), + 'login': self.setting.getSetting("torrent_transmission_login"), + 'password': self.setting.getSetting("torrent_transmission_password") + } + elif client == '2': + self.client = 'vuze' + config = { + 'host': self.setting.getSetting("torrent_vuze_host"), + 'port': self.setting.getSetting("torrent_vuze_port"), + 'url': '', + 'login': self.setting.getSetting("torrent_vuze_login"), + 'password': self.setting.getSetting("torrent_vuze_password") + } + + return config + + def add(self, torrent, dirname): + return self.client.add(torrent, dirname) + + def add_url(self, torrent, dirname): + return self.client.add_url(torrent, dirname) + + def list(self): + return self.client.list() + + def listdirs(self): + return self.client.listdirs() + + def listfiles(self, id): + return self.client.listfiles(id) + + def delete(self, id): + return self.client.delete(id) + + def setprio(self, id, ind): + return self.client.setprio(id, ind) + + def setprio_simple(self, id, prio, ind): + # Debug('[setprio_simple] '+str((id, prio, ind))) + return self.client.setprio_simple(id, prio, ind) + + def action_simple(self, action, id): + return self.client.action_simple(action, id) diff --git a/resources/utorrent/net.pyo b/resources/utorrent/net.pyo new file mode 100644 index 0000000000000000000000000000000000000000..d048ddedb1ff4dbbd796a2b75f3cdf7610cd908b GIT binary patch literal 37643 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 N;o-j>{_ElQ{9oYSF;f5l literal 0 HcmV?d00001